Pythonにて長さ100000のリスト arr
があるとします。このリストの末尾を削除するとき
arr = arr[:-1]
とする方法は非常に遅いので要注意です。arr[:-1]
により新規にリストが作成されてしまうのが原因です。ついカジュアルにこのような書き方をしてしまいがちなので注意が必要です。
上記方法に比べ、
del arr[-1]
や
arr.pop(-1)
とする方法だと1000倍ほど高速です。
検証用コードを以下に示します。
import time ARRAY_SIZE = 100000 REPEAT_NUM = 1000 def func1(): arr = [0] * ARRAY_SIZE for i in range(REPEAT_NUM): arr = arr[:-1] arr.append(0) def func2(): arr = [0] * ARRAY_SIZE for i in range(REPEAT_NUM): del arr[-1] arr.append(0) def func3(): arr = [0] * ARRAY_SIZE for i in range(REPEAT_NUM): arr.pop(-1) # pop()の戻り値(指定したindexの値)はここでは使っていない arr.append(0) def main(): s = time.time() func1() print("func1() time:", time.time() - s) s = time.time() func2() print("func2() time:", time.time() - s) s = time.time() func3() print("func3() time:", time.time() - s) main()
実行例は以下です。
$ python3 tmp.py func1() time: 1.9272332191467285 func2() time: 0.0010654926300048828 func3() time: 0.0011544227600097656