繁体   English   中英

变量名称的长度会影响程序运行的速度吗?

[英]Does the length of a variable's name affect the speed the program will run?

我有一小段代码需要长时间运行。 我想知道我使用的变量名称的长度是否可以改变程序执行的速度。 这是一个用 Python 编写的非常简单的示例。

程序A

    x = 1
    while not x == 0:
          print('message')

程序B

    xyz = 1
    while not xyz == 0:
          print('message')

如果我在两台相同的机器上运行程序 A 和程序 B 30 年,程序 A 会比程序 B 打印更多次“消息”。

不,名称本身对结果代码的运行速度没有影响。 变量名只是用来区分 Python 源代码中由整数索引表示的两个变量在查找表中:

>>> dis.dis('x=1')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (None)
              6 RETURN_VALUE
>>> dis.dis('xyz=1')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (xyz)
              4 LOAD_CONST               1 (None)
              6 RETURN_VALUE
>>> dis.dis('x=1;xyz=2;')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (2)
              6 STORE_NAME               1 (xyz)
              8 LOAD_CONST               2 (None)
             10 RETURN_VALUE

在前两个中,您会注意到在生成的字节码中没有基于变量名称的区别。 在最后,您将看到字节码在两者之间进行区分,但仅在定义它们的顺序上,而不是标签的长度上。

@chepner 提到的结果是正确的,Python 在控制台中运行代码可能需要更长的时间,但是一旦代码被编译,结果是相同的。

为了确保这是正确的,我创建了以下代码也受到@knifer 的回答的启发:

from time import time
from numpy import average,std

x                                              = 1
xyzabcdexyzabcdefghidjakeldkjlkfghidjakeldkjlk = 1

short_runs = 0
long_runs  = 0

for _ in range(int(2e7)):
    
    t0 = time()
    if x:
        pass
    short_runs += time() - t0
    
    t0 = time()
    if xyzabcdexyzabcdefghidjakeldkjlkfghidjakeldkjlk:
        pass
    long_runs  += time() - t0

print('Runtime results:')
print(f"Small variable runs : (sum = {short_runs:.3f})")
print(f"Long  variable runs : (sum = {long_runs :.3f})")

我提出的代码有些不同,因为长变量名和短变量名的试验运行是交织在一起的,这样由底层操作系统进程引起的任何差异都被最小化。

代码的结果取决于您是copy-paste代码copy-paste到 Python 控制台中,还是将代码作为程序调用 ( python trial_runs.py )。 使用长变量名称时,使用copy-paste运行往往会更慢,而将代码作为程序调用会产生相同的运行时间。

附注。 实际运行时间对我来说一直在变化(在一个方向或另一个方向),因此很难报告确切的值。 即使是长变量名有时也可以运行得更快,尽管这在 Python 控制台上非常罕见。 最大的结论是,无论哪种方式,任何差异都非常小:)

差异非常小,我们不能得出结论,这是因为变量的名称。

import timeit
x=1
xyz=1


start_time = timeit.default_timer()
for i in range(1,1000000):
    if x==1:
        print("message")
elapsed = timeit.default_timer() - start_time


start_time2 = timeit.default_timer()
for i in range(1,1000000):
    if xyz==1:
        print("message")

elapsed2 = timeit.default_timer() - start_time2

print("small variable printing = ",str(elapsed),"big variable printing = "+str(elapsed2))

结果是:

small variable printing =  3.6490847053481588 big variable printing = 3.7199463989460435

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM