簡體   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