多个赋值可能会使代码变慢吗?

时间:2016-04-19 21:00:41

标签: python python-2.7 time variable-assignment timeit

我的问题很简单。使用多个赋值会使代码变慢吗? (即使速度较慢,是否值得考虑?)

我的代码需要性能。这个赋值是一个循环,可能会多次执行。

我快速检查了一下。而且我不确定如何分析这些结果或我应该从中得出什么结论。让我把这些放在你身边。

import timeit
print(timeit.timeit("a = 1; b = 2", number=100000))
print(timeit.timeit("a = 1; b = 2", number=100000))
print(timeit.timeit("a = 1; b = 2", number=100000))

print

print(timeit.timeit("a, b = (1, 2)", number=100000))
print(timeit.timeit("a, b = (1, 2)", number=100000))
print(timeit.timeit("a, b = (1, 2)", number=100000))

print

print(timeit.timeit("a = (1, 2) ;b =a[0] ;c = a[1]", number=100000))
print(timeit.timeit("a = (1, 2) ;b =a[0] ;c = a[1] ", number=100000))
print(timeit.timeit("a = (1, 2) ;b =a[0] ;c = a[1] ", number=100000)) 

给出:

0.00271645813545
0.00316250124554
0.00289307923274

0.00323691303956
0.00329421867402
0.00343021264239

0.011346943279
0.0154434408356
0.0141857104552

我跑了几次,这是整体结果。

出现了一些细微差别(除了先创建元组,这已经很明显了,只是想看看。),我应该从中得出什么结论呢?

2 个答案:

答案 0 :(得分:1)

回答这个具体问题以及一些讨论要点: https://wiki.python.org/moin/PythonSpeed(他们断言是的,多次分配较慢,除非用于交换。)

我通过运行这个来消除了元组的创建:

import timeit
print (timeit.timeit("i=(1,2); a=1; b=2", number=1000000))
print (timeit.timeit("i=(1,2); a, b = i", number=1000000))

这种差异似乎远远超过了一些人的建议,但是当我改变他们得到定时的顺序时,第一次看起来似乎运行得更慢。有时它足够慢,分配两次需要更长的时间,而不是多次分配元组。我的结论是这种测试机制存在缺陷。

多次分配速度较慢,因此如果您在循环中执行多项分配,则可以相加。但你必须做很多事情,这表明可能有更好的方法。要真正提高代码的性能,1)对其进行分析并找出实际需要花费的时间。 2)分析算法以找到你可以做得更好的事情。

探查者可能实际上同意你并说这个循环太慢了,但通常当一个人试图猜测什么慢......我们弄错了。然后我们浪费时间试图修复一些并没有真正减慢代码速度的东西,最终没有任何变化。

答案 1 :(得分:0)

多次赋值较慢的原因是隐式元组解包。考虑以下两个功能:

def regular():
    a = 1
    b = 2

def multiple():
    a, b = 1, 2

dis模块可用于查看相应的字节码。

from dis import dis

dis(regular)
#  2           0 LOAD_CONST               1 (1)
#              3 STORE_FAST               0 (a)
#
#  3           6 LOAD_CONST               2 (2)
#              9 STORE_FAST               1 (b)
#             12 LOAD_CONST               0 (None)
#             15 RETURN_VALUE    

dis(multiple)
#  6           0 LOAD_CONST               3 ((1, 2))
#              3 UNPACK_SEQUENCE          2               <-- This line here.
#              6 STORE_FAST               0 (a)
#              9 STORE_FAST               1 (b)
#             12 LOAD_CONST               0 (None)
#             15 RETURN_VALUE        

虽然regular必须再次LOAD_CONST,但这比UNPACK_SEQUENCE更快。