为什么返回元组比Python中的多个值更快?

jia*_*yin 1 python performance benchmarking tuples return-value

我做了一个小测试:

In [12]: def test1():
    ...:     return 1,2,3
    ...: 

In [13]: def test2():
    ...:     return (1,2,3)
    ...: 

In [14]: %timeit a,b,c = test1()
Run Code Online (Sandbox Code Playgroud)

最慢的运行时间比最快的运行时间长66.88倍.这可能意味着正在缓存中间结果.10000000次循环,最佳3:每循环92.7 ns

In [15]: %timeit a,b,c = test2()
Run Code Online (Sandbox Code Playgroud)

最慢的运行时间比最快的时间长74.43倍.这可能意味着正在缓存中间结果.10000000次循环,最佳3:每循环80.1 ns

返回元组比返回多个值快约15%.为什么会这样?

Łuk*_*ski 8

双方test1test2在相同的字节码的结果,所以他们有相同的速度进行.您的测量条件不一致(例如,由于额外的后台进程,测试2的CPU负载增加).

>>> import dis
>>> def test1():
...     return 1,2,3
...
>>> def test2():
...     return (1,2,3)
...
>>> dis.dis(test1)
  2           0 LOAD_CONST               4 ((1, 2, 3))
              3 RETURN_VALUE
>>> dis.dis(test2)
  2           0 LOAD_CONST               4 ((1, 2, 3))
              3 RETURN_VALUE
>>>
Run Code Online (Sandbox Code Playgroud)

  • @ReutSharabani创建元组的语法是*逗号*,括号是可选的.所以写'x = 1,2,3`就像写'x =(1,2,3)`一样创建元组`(1,2,3)`**.唯一的区别在于解析过程中,但正如本答案中所示,解释器在两种情况下都完全相同.现在,鉴于您正在分析的操作速度如此之快,预计您将在不同的运行期间看到很大的差异.尝试多次运行`test1`测试,你会看到时间稍微偏离. (2认同)