我有一个Python代码,其中我有一个列表,其中一些元素被引用并在一个运行多次的循环中使用。以下是我所谈论的一个例子:
for n in range(0, 1000000):
a = my_list[n] * 2
b = my_list[n] + my_list[n+1]
c = my_list[n] * my_list[n+1]
d = my_list[n] - my_list[n+1]
my_function(a, b, c, d)
将my_list[n]
和my_list[n+1]
存储在两个变量中然后将它们用作以下内容会更快吗?
for n in range(0, 1000000):
my_list_n = my_list[n]
my_list_np1 = my_list[n+1]
a = my_list_n * 2
b = my_list_n + my_list_np1
c = my_list_n * my_list_np1
d = my_list_n - my_list_np1
my_function(a, b, c, d)
答案 0 :(得分:1)
尝试计时:
from __future__ import print_function
def my_function(a, b, c, d):
e=a*b*c*d
def f1():
for n in range(0, 1000000):
a = my_list[n] * 2
b = my_list[n] + my_list[n+1]
c = my_list[n] * my_list[n+1]
d = my_list[n] - my_list[n+1]
my_function(a, b, c, d)
def f2():
for n in range(0, 1000000):
my_list_n = my_list[n]
my_list_np1 = my_list[n+1]
a = my_list_n * 2
b = my_list_n + my_list_np1
c = my_list_n * my_list_np1
d = my_list_n - my_list_np1
my_function(a, b, c, d)
def f3():
for n in range(0, 1000000):
my_function(my_list[n] * 2,
my_list[n] + my_list[n+1],
my_list[n] * my_list[n+1],
my_list[n] - my_list[n+1])
if __name__ == '__main__':
import timeit
import sys
print(sys.version)
my_list=range(1000001)
n=2
for f in (f1, f2, f3):
res=timeit.timeit("{}()".format(f.__name__), setup="from __main__ import {}, my_list".format(f.__name__), number=n)
print("{}: {:.3} secs".format(f.__name__, res))
各种python版本的结果:
2.7.7 (default, Jun 14 2014, 23:12:13)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]
f1: 2.27 secs
f2: 1.77 secs
f3: 2.07 secs
3.4.1 (default, May 19 2014, 13:10:29)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]
f1: 4.14 secs
f2: 2.41 secs
f3: 4.16 secs
2.7.6 (32f35069a16d, Jun 06 2014, 20:12:47)
[PyPy 2.3.1 with GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]
f1: 0.257 secs
f2: 0.241 secs
f3: 0.241 secs
3.2.5 (986752d005bb+, Jun 19 2014, 19:20:06)
[PyPy 2.3.1 with GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)]
f1: 0.267 secs
f2: 0.263 secs
f3: 0.269 secs
总的来说,是的 - 它更快。多少取决于版本。
快速观察一下这是一个很好的枚举应用程序:
def f4():
for n, e in enumerate(my_list[0:1000000]):
np1 = my_list[n+1]
my_function(e * 2,
e + np1,
e * np1,
e - np1)
这是所有版本中最快的版本。