我的问题很简单。使用多个赋值会使代码变慢吗? (即使速度较慢,是否值得考虑?)
我的代码需要性能。这个赋值是一个循环,可能会多次执行。
我快速检查了一下。而且我不确定如何分析这些结果或我应该从中得出什么结论。让我把这些放在你身边。
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
我跑了几次,这是整体结果。
出现了一些细微差别(除了先创建元组,这已经很明显了,只是想看看。),我应该从中得出什么结论呢?
答案 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
更快。