2012-08-24 25 views
11

有沒有什麼可以通過在像python這樣的語言中使用較短的變量名來獲得記憶和速度?有沒有什麼可以從短變量名獲得?

如果是這樣,那麼考慮這種情況會是什麼樣的情況?

注意

我絕不提倡短變量名,我只是想知道,請(重新)閱讀的問題。

請注意2 請,我明白描述性變量名稱的價值。我已經查看了足夠的代碼來使用描述性名稱而不是較短的名稱,並瞭解它的價值。一個普通的「否」並不真正有幫助。

+1

我認爲這很可能導致宗教戰爭。 –

+1

@PreetSangha:恩,有一個客觀的答案:**沒有**。 –

+1

你爲什麼要對比「短」和「描述」的名字?一個好的變量名稱必須是簡短的和描述性的。 – georg

回答

12

「like python」存在問題,因爲並非所有的解釋語言都是相同的。

對於一個純粹解釋的語言,它會比使用預編譯步驟的Python有更多的影響。嚴格地說,這不是一種語言差異(你可以有一個預編譯的Javascript引擎,而不是一個),但它確實會影響這個問題的答案。

爲了包括每一種解釋型語言,「像python」一樣,我會說答案是「是的,至少在某些時候」。接下來的問題是,「多少」。

從1997年到1998年初,我正在研究一些相當複雜的JavaScript代碼,它利用了Netscape Navigator 4和Internet Explorer 4的一些新功能。這是一個非常龐大的JavaScript文件 - 當流行的撥號意味着每千字節以站點速度計算。

由於這個原因,我們使用了最小化腳本。這樣做的主要原因是重寫變量變得更短(lastHeight變成a,userSel becmomes b等)。

它不僅減少了下載時間,而且還使得其中一個較重的功能明顯更快。但如果你是一個在整個工作日裏都沒有別的東西的人,那就意味着這很重要,這幾乎意味着我和另外一個同事。

所以,是的,如果我們把Java腳本到「喜歡蟒蛇」類別儘可能解釋去的話,就可以有所作爲,在下列條件下:

  1. 它是在奔騰運行,Pentium Pro的和486s(Pentium II已經出來了,但我們沒有)。我在該項目中部分獲得了一臺新機器,這意味着我從133MHz降至166MHz。
  2. 這是一個相當大的令人討厭的循環(大部分腳本沒有明顯的區別)。
  3. 從15年前開始,它在腳本引擎上運行,而腳本引擎性能方面的改進沒有任何改進。

它仍然沒有太大的區別。

我們可以假設,其他一些解釋型語言也受到類似微小程度的影響。

即使在1997年,如果不是巧合地給了我另一個優點,我也不會感到困擾,而且我當然也沒有在最小化版本上工作。

+0

更何況,JavaScript解釋器時下有優化,那時他們甚至無法夢想。 – orlp

+0

@ nightcracker呃,不,我確實提過它,作爲條件編號3 :) –

+0

woops,讀過它 – orlp

19

人數人數人數號

使用可讀的名稱,而不是短名稱。性能差異絕對忽略不計。


$ python -m timeit "i = 5" "i *= i" 
10000000 loops, best of 3: 0.0938 usec per loop 

$ python -m timeit "is_there_anything_to_be_gained_from_short_variable_names = 5" "is_there_anything_to_be_gained_from_short_variable_names *= is_there_anything_to_be_gained_from_short_variable_names" 
10000000 loops, best of 3: 0.0927 usec per loop 

諷刺的是,當在該PC上測得的長變量名因此而被測量〜每執行0.001微秒更快。

+2

Upvote因爲...沒有。 – Exelian

+0

哦,我同意你的觀點,我討厭像'a'這樣的變量名,這是魔鬼在做的。但我的問題不是關於那個問題,而是關於是否有什麼可以獲得的。 –

+1

@DanielFigueroa:沒有。對於其中一個,沒有性能損失,並且缺乏可讀性是對它的另一次罷工。沒有好處。 –

2

如果你的意思是解釋語言的語言像「Python」這樣的語言,那麼是的,它會有所作爲,因爲解析可能需要更長的時間。我會說這個區別是不明顯的。

雖然我完全同意夜間爆竹;不要這樣做。讓你的代碼對於人類來說是可讀的。讓解析器/編譯器處理機器的可讀性。

記住優化的規則:

  1. 不要這樣做。
  2. (僅限專家)不要這樣做。
2

對於短循環索引和變量是短暫的,您應該使用短變量名稱只有

否則使用描述性名稱,但不要過分,請不要使用Hungarian notation

+2

不是。適當時使用它們。例如,數學的函數通常使用短名稱:'f = lambda x:x * x'。 – orlp

1

幾乎沒有。無可否認,它可能會在python預編譯腳本時第一次減慢查找變量名稱的速度。但是,由短變量名造成的混淆導致的時間通常遠遠超過執行腳本所節省的時間。

0

從orlps的回答中,我認爲Python類使用字典進行查找,所以我想知道在這方面是否有任何優勢。

import timeit 

A = """ 
class A_CLASS_WITH_A_LONG_NAME: 
    def a_function_with_a_long_name(self): 
     return 1 

A_CLASS_WITH_A_LONG_NAME().a_function_with_a_long_name() 
""" 

B = """ 
class A: 
    def a(self): 
     return 1 

A().a() 
""" 

print(timeit.timeit(stmt = A, number = 1000000)) 
print(timeit.timeit(stmt = B, number = 1000000)) 

我們得到的數字:

  • 龍= 12.362802280999858
  • 短= 11.445085418999952

哪些是約8%的不同。

運行,而不是使用timeit的模塊(number = 100000000)內:

  • 龍= 24.87908697128296
  • 短= 24。695187091827393

其中約有1%不同。

我可以得出結論則可能是內聯的代碼或timeit分析器的複雜性差異(timeit似乎是50倍左右慢),但CPython的似乎做優化掉任何差異的一個好工作。我不能說這是否仍然適用於擁有更多成員的班級,因爲dict會有更多的成績。

相關問題