リスト内全要素の型変換
前回、Pythonでリスト内の全要素の型変換をする方法を4種類紹介しました。

前回試したのは以下の4種類。
- for文を使う方法
- リスト内包表記を使う方法
- np.array(リスト, dtype=’変換後の型’).tolist()を使う方法
- np.array(リスト).astype(‘変換後の型’).tolist()を使う方法
それぞれ同じようにint型をstr型に変更できる、つまり型変換に使えることを確認したのち、それぞれの処理時間をけいそくしてみました。
しかし思ったよりも処理速度に差はありませんでした。
普段からリスト内包表記は速いというイメージがあったため、これは何かおかしいんじゃないかと思い、繰り返し回数を色々と変えてみて検討したというのが今回のお話。
プログラム
ということで今回検討に使ったプログラムを見てみましょう。
今回は試行回数を10倍ずつ増やしていって、処理にかかる時間を計測していきます。
そのためJupyter notebookの最初のセルにはサイクル数の変数を準備しました。
test = range(10**1)
サイクル数は101(10)から107(10,000,000)まで変化させました。
そしてこれ以降は前回行った4種類の方法を別々のセルに用意し、それぞれ実行し、その処理速度を取得しました。
for文を使う方法
%%timeit
test_str = []
for val in test:
test_str.append(str(val))
リスト内包表記を使う方法
%%timeit
test_str = [str(val) for val in test]
np.array(リスト, dtype=’変換後の型’).tolist()を使う方法
%%timeit
import numpy as np
test_str = np.array(test, dtype='str').tolist()
np.array(リスト).astype(‘変換後の型’).tolist()を使う方法
%%timeit
import numpy as np
test_str = np.array(test).astype('int').tolist()
結果
試してみた結果がこちらです。
numpy1は「np.array(リスト, dtype=’変換後の型’).tolist()を使う方法」、numpy2が「np.array(リスト).astype(‘変換後の型’).tolist()を使う方法」です。

このままでは分かりにくいのでグラフ化しました。
X軸がサイクル数の乗数、Y軸が処理時間です。

サイクル数が少ないところが分かりにくいので、Y軸を対数表示にしたものがこちら。

一番遅いのが「np.array(リスト, dtype=’変換後の型’).tolist()を使う方法」で一番速いのが「np.array(リスト).astype(‘変換後の型’).tolist()を使う方法」でしたが、それでも3.4倍程度の差でした。
もちろん処理が重たくなれば、その3.4倍のタイムロスは大きいのでしょうが、私みたいに普段ちょっとした処理を自動化するというPythonユーザーにとってはそれほど変わらないような気がします。
本当は何十倍も違ったり、サイクル数を増やすと他の手法と比べて格段に速くなったり、遅くなったりするといった得手不得手があると予想していたのですが、どれも同じように遅くなるという面白みのない結果となってしまいました。
まぁこういうこともあるということで今回はご勘弁ください。
次回は連番のファイル名を付ける際に便利なゼロパディング(0埋め)を勉強していきましょう。

ではでは今回はこんな感じで。
コメント