PythonのListの連結方法で算術演算子やextendを使ったときのパフォーマンス測定
今回はPythonのListの連結方法で算術演算子やextendを使ったときのパフォーマンスを測定した結果についてご紹介いたします。
PythonのListの連結方法で算術演算子やextendを使ったときのパフォーマンス測定
PythonのListの連結方法として、メジャーなものに次の三種類があります。
1 2 3 4 5 6 7 8 9 10 11 |
testList = [1, 2, 3] appendList = [4, 5, 6] # Pattern1 testList = testList + appendList # Pattern2 testList += appendList # Pattern3 testList.extend(appendList) |
今回は上記3パターンで可読性は考えず、どのコードが一番パフォーマンスが良いのか調べていきます。
用意したコードは次のコードです。(読み飛ばして良いです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# Pattern1パフォーマンス調査 import time resultList = [] for j in range(100): testList = [] appendList = [1, 2, 3] start = time.time() for i in range(10000): testList = testList + appendList process_time = time.time() - start print(str(j+1) + ' times.') resultList.append(process_time) print(process_time) print('') ave = sum(resultList) / len(resultList) print(resultList) print('平均: ' + str(ave)) # Pattern2パフォーマンス調査 import time resultList = [] for j in range(100): testList = [] appendList = [1, 2, 3] start = time.time() for i in range(10000): testList += appendList process_time = time.time() - start print(str(j+1) + ' times.') resultList.append(process_time) print(process_time) print('') ave = sum(resultList) / len(resultList) print(resultList) print('平均: ' + str(ave)) # Pattern3パフォーマンス調査 import time resultList = [] for j in range(100): testList = [] appendList = [1, 2, 3] start = time.time() for i in range(10000): testList.extend(appendList) process_time = time.time() - start print(str(j+1) + ' times.') resultList.append(process_time) print(process_time) print('') ave = sum(resultList) / len(resultList) print(resultList) print('平均: ' + str(ave)) |
Pattern1~Pattern3までの処理をそれぞれ1万回繰り返して、それを100回ずつループさせます。
つまり各パターンで100万回繰り返してるわけですね。
1万回を100回ずつループさせた平均の処理時間をprintしております。
上記ソースコードを、各パターンごとに実行した結果は次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Pattern1実行結果 [0.5067667961120605, 0.4917480945587158, 0.4922349452972412, 0.4913136959075928, 0.49231719970703125, 0.49150586128234863, 0.49083590507507324, 0.4911930561065674, 0.4922459125518799, 0.49088525772094727, 0.4909060001373291, 0.4927229881286621, 0.4907870292663574, 0.49115777015686035, 0.4919290542602539, 0.4931962490081787, 0.4986460208892822, 0.49199795722961426, 0.4913179874420166, 0.49204587936401367, 0.4938499927520752, 0.4918057918548584, 0.49272608757019043, 0.4932694435119629, 0.49062299728393555, 0.4917130470275879, 0.49151086807250977, 0.49293088912963867, 0.49086689949035645, 0.4919722080230713, 0.4916810989379883, 0.4899759292602539, 0.4945662021636963, 0.4907212257385254, 0.4918081760406494, 0.49181389808654785, 0.4964461326599121, 0.49417805671691895, 0.4917478561401367, 0.49234890937805176, 0.49193286895751953, 0.4902768135070801, 0.4926328659057617, 0.4907069206237793, 0.49290013313293457, 0.4920327663421631, 0.49255895614624023, 0.49147796630859375, 0.49097204208374023, 0.49197888374328613, 0.49129700660705566, 0.4922187328338623, 0.49138879776000977, 0.492203950881958, 0.49034595489501953, 0.49220991134643555, 0.4924471378326416, 0.4972069263458252, 0.49254775047302246, 0.4937107563018799, 0.49035215377807617, 0.4935569763183594, 0.49182796478271484, 0.4917769432067871, 0.4913668632507324, 0.4911510944366455, 0.49059200286865234, 0.4913651943206787, 0.4908270835876465, 0.49152088165283203, 0.49277210235595703, 0.49136900901794434, 0.49219679832458496, 0.49146604537963867, 0.49290895462036133, 0.4903280735015869, 0.493602991104126, 0.49218106269836426, 0.49866604804992676, 0.4917030334472656, 0.4921238422393799, 0.49180006980895996, 0.4934968948364258, 0.49060797691345215, 0.4917881488800049, 0.49164485931396484, 0.4926261901855469, 0.4903881549835205, 0.4924449920654297, 0.49248480796813965, 0.4914438724517822, 0.49328112602233887, 0.4911327362060547, 0.4918091297149658, 0.4912881851196289, 0.49074268341064453, 0.4920661449432373, 0.4924910068511963, 0.4914889335632324, 0.498593807220459] 平均: 0.4923063135147095 # Pattern2実行結果 [0.0009462833404541016, 0.0009295940399169922, 0.0008728504180908203, 0.0008640289306640625, 0.0008618831634521484, 0.0008609294891357422, 0.0008680820465087891, 0.0008709430694580078, 0.0009260177612304688, 0.000926971435546875, 0.0009241104125976562, 0.0009229183197021484, 0.00092315673828125, 0.0009243488311767578, 0.00086212158203125, 0.0009601116180419922, 0.0010018348693847656, 0.0009479522705078125, 0.0008647441864013672, 0.0008692741394042969, 0.0008671283721923828, 0.00086212158203125, 0.0008618831634521484, 0.0008718967437744141, 0.0008640289306640625, 0.0008640289306640625, 0.0008289813995361328, 0.00080108642578125, 0.000804901123046875, 0.0007989406585693359, 0.0008032321929931641, 0.0008051395416259766, 0.0008339881896972656, 0.0008058547973632812, 0.0008828639984130859, 0.0008058547973632812, 0.0008168220520019531, 0.0008041858673095703, 0.0008018016815185547, 0.0008058547973632812, 0.0007758140563964844, 0.0007722377777099609, 0.0007901191711425781, 0.0007760524749755859, 0.0007739067077636719, 0.0007739067077636719, 0.0007736682891845703, 0.0007758140563964844, 0.0007719993591308594, 0.0007779598236083984, 0.0007731914520263672, 0.0007770061492919922, 0.0007779598236083984, 0.0007729530334472656, 0.0009050369262695312, 0.0008728504180908203, 0.0008451938629150391, 0.0007681846618652344, 0.000766754150390625, 0.0007548332214355469, 0.0007541179656982422, 0.0007679462432861328, 0.0007491111755371094, 0.0007488727569580078, 0.0007562637329101562, 0.0007622241973876953, 0.0007758140563964844, 0.0007617473602294922, 0.0007650852203369141, 0.0007739067077636719, 0.0007770061492919922, 0.0007729530334472656, 0.0007729530334472656, 0.0007958412170410156, 0.0007927417755126953, 0.0007741451263427734, 0.0008063316345214844, 0.0008037090301513672, 0.0007801055908203125, 0.0007648468017578125, 0.0007598400115966797, 0.0007739067077636719, 0.0007989406585693359, 0.0008089542388916016, 0.0007889270782470703, 0.0007669925689697266, 0.0007779598236083984, 0.0007679462432861328, 0.0007708072662353516, 0.0007867813110351562, 0.0007750988006591797, 0.0008668899536132812, 0.0007779598236083984, 0.0007779598236083984, 0.0007779598236083984, 0.0007731914520263672, 0.0007731914520263672, 0.0007839202880859375, 0.0007679462432861328, 0.0007619857788085938] 平均: 0.0008158707618713379 # Pattern3実行結果 [0.0010678768157958984, 0.001039266586303711, 0.0010039806365966797, 0.0009899139404296875, 0.0009970664978027344, 0.0009829998016357422, 0.0009818077087402344, 0.0009801387786865234, 0.0009810924530029297, 0.0011298656463623047, 0.0010561943054199219, 0.0009789466857910156, 0.0009789466857910156, 0.0009891986846923828, 0.0009791851043701172, 0.000978231430053711, 0.0009751319885253906, 0.0009791851043701172, 0.0009860992431640625, 0.0009751319885253906, 0.0009748935699462891, 0.0009768009185791016, 0.0009739398956298828, 0.0009799003601074219, 0.001096963882446289, 0.0010440349578857422, 0.001001119613647461, 0.0009169578552246094, 0.0009131431579589844, 0.0009579658508300781, 0.0009829998016357422, 0.0009810924530029297, 0.0009887218475341797, 0.0009768009185791016, 0.0010037422180175781, 0.000988006591796875, 0.0009741783142089844, 0.0009746551513671875, 0.0009777545928955078, 0.0009789466857910156, 0.0009591579437255859, 0.0010917186737060547, 0.0009200572967529297, 0.0009310245513916016, 0.0009150505065917969, 0.0009100437164306641, 0.0009169578552246094, 0.0009162425994873047, 0.0009119510650634766, 0.0009100437164306641, 0.0009229183197021484, 0.0009179115295410156, 0.0009241104125976562, 0.0009174346923828125, 0.0008790493011474609, 0.0008490085601806641, 0.0008471012115478516, 0.0008449554443359375, 0.0008521080017089844, 0.0010848045349121094, 0.0009331703186035156, 0.0008702278137207031, 0.0008540153503417969, 0.0008449554443359375, 0.0008602142333984375, 0.0008440017700195312, 0.0008461475372314453, 0.0008227825164794922, 0.0008189678192138672, 0.0008289813995361328, 0.0008521080017089844, 0.0008549690246582031, 0.0009140968322753906, 0.0008261203765869141, 0.0008280277252197266, 0.0008177757263183594, 0.0008227825164794922, 0.0008752346038818359, 0.0008308887481689453, 0.0008258819580078125, 0.0008330345153808594, 0.0008068084716796875, 0.0008168220520019531, 0.0008080005645751953, 0.0008177757263183594, 0.0007927417755126953, 0.0007939338684082031, 0.0008258819580078125, 0.0008120536804199219, 0.0008428096771240234, 0.00080108642578125, 0.0008182525634765625, 0.0008168220520019531, 0.0008211135864257812, 0.0008177757263183594, 0.0008120536804199219, 0.0008041858673095703, 0.0008080005645751953, 0.0008080005645751953, 0.0008051395416259766] 平均: 0.0009134817123413086 |
Pattern1のListを普通に足したものが遥かに時間がかかっています。
一方、Pattern2とPattern3はそれほど時間がかからず、実行時間も短いです。
こちらには書きませんがPattern2とPattern3を何度か実行してみましたが、同じような処理時間でした。
結論としては、
1 2 3 4 5 |
# Pattern2 testList += appendList # Pattern3 testList.extend(appendList) |
のどちらかを使う方が良さそうです。
あとは好みですね。
終わりに
今回はPythonのListの連結方法で算術演算子やextendを使ったときのパフォーマンスを測定した結果についてご紹介いたしました。
PythonやPythonを使ったライブラリやフレームワークのパフォーマンスの調査に興味があり、様々なコーディング方法の違いによる最適化の調査を行っております。
リストにまとめてあるので、よろしければ覗いてみてください。
Pythonとそのライブラリやフレームワークのパフォーマンス調査結果リスト
ディスカッション
コメント一覧
まだ、コメントがありません