python numpy.append と listのappendの比較

numpy.appendが遅いというのを見たので、計算してみました。

import numpy as np
import time
import pandas as pd

data_nums = np.logspace(1, 5, 5)
# [1.e+01 1.e+02 1.e+03 1.e+04 1.e+05]
data_nums = data_nums.astype("int64")

df = pd.DataFrame(
    index=range(len(data_nums)), columns=["data_num", "python_list", "numpy_ndarray"]
)
print(df)
df.loc[:, "data_num"] = data_nums
print(df)

for data_num in data_nums:

    df_index = df.index[df["data_num"] == data_num].to_list()
    print(f"--------------------------")
    # print(f"data_num_index : {df_index}")
    print(f"data_num : {data_num}")
    print(f"--------------------------")

    # using python list append
    start_time_python_list = time.perf_counter()

    data_numpy_append = np.empty(0)
    data_numpy_append_list = data_numpy_append.tolist()  #  numpy ndarray -> python list
    for i in range(data_num):  # append data
        data_numpy_append_list.append(i)
    data_numpy_append_2 = np.asarray(
        data_numpy_append_list
    )  # python list -> numpy ndarray
    # print(data_numpy_append_2)

    end_time_python_list = time.perf_counter()
    elapsed_time_python_list = end_time_python_list - start_time_python_list
    print(f"python_list : {elapsed_time_python_list} [sec]")
    df.at[df.index[df_index[0]], "python_list"] = elapsed_time_python_list

    # using numpy ndarray append
    start_time_numpy = time.perf_counter()

    data_numpy_append_ = np.empty(0)
    for i in range(data_num):  # append data
        data_numpy_append_ = np.append(data_numpy_append_, i)
    # print(data_numpy_append_)

    end_time_numpy = time.perf_counter()
    elapsed_time_numpy = end_time_numpy - start_time_numpy
    print(f"numpy_ndarray : {elapsed_time_numpy} [sec]")
    df.at[df.index[df_index[0]], "numpy_ndarray"] = elapsed_time_numpy

    print(f"")

print(df)

結果

listに変換したほうが早い。

--------------------------
data_num : 10
--------------------------
python_list : 1.7700018361210823e-05 [sec]
numpy_ndarray : 7.660000119358301e-05 [sec]

--------------------------
data_num : 100
--------------------------
python_list : 3.930006641894579e-05 [sec]
numpy_ndarray : 0.0005637999856844544 [sec]

--------------------------
data_num : 1000
--------------------------
python_list : 0.00019459996838122606 [sec]
numpy_ndarray : 0.005826800013892353 [sec]

--------------------------
data_num : 10000
--------------------------
python_list : 0.001879699993878603 [sec]
numpy_ndarray : 0.06156469997949898 [sec]

--------------------------
data_num : 100000
--------------------------
python_list : 0.01734230003785342 [sec]
numpy_ndarray : 2.0233694999478757 [sec]

   data_num python_list numpy_ndarray
0        10    0.000018      0.000077
1       100    0.000039      0.000564
2      1000    0.000195      0.005827
3     10000     0.00188      0.061565
4    100000    0.017342      2.023369

この記事が気に入ったらサポートをしてみませんか?