因為自己英語完全不懂,

所以平時自己寫東西都是用中文當變數名啥的,

突然想到這樣會不會影響到速度什麼的?


首先,python這樣的語言,只能做有限的"詞法編址"(lexical address),不可能實現 @王加加 所說的「所有變數名函數名等名稱,在轉成位元組碼後,只是一個個地址,名稱只是在寫代碼的時候增加可讀性。」

為什麼呢?因為很多動態語言使用的基本方法是「延遲綁定」(late binding)。這代表了兩個意思:

  • 創建綁定的過程是動態的
  • 在環境裏尋找綁定的過程也是動態的

我也可以斷言,python是不能完全避免「延遲綁定」的。

我沒有用過python,也不清楚python的實現,為什麼我敢如此斷言呢?因為以下代碼可以在python解釋器裏執行:

somename = input()
def a():
return 2

exec("def {}():
return 1".format(somename))
print(a())

在shell裏運行效果如下:

ayanamists@DESKTOP-KBI2TVT:~$ python test.py
"a"
1

顯然地,在執行之前的任何一個階段,都不可能知道a會綁定上什麼東西。

至於那位答主根據位元組碼給出的結果, 我在他的代碼中加上一行:

import dis
def a(s):
exec("s = 0")
return s+1

dis.dis(a)
print(a(1))

結果是

ayanamists@DESKTOP-KBI2TVT:~$ python test.py
3 0 LOAD_CONST 1 (s = 0)
3 LOAD_CONST 0 (None)
6 DUP_TOP
7 EXEC_STMT

4 8 LOAD_FAST 0 (s)
11 LOAD_CONST 2 (1)
14 BINARY_ADD
15 RETURN_VALUE
1

這反而說明解釋器必須在運行時知道『s』這個標識符對應的是0號局部變數。

綜上所述,python在編譯成位元組碼時確實進行了一定的詞法編址工作,把一些綁定映射為了一個「地址」,但由於無法避免某些【延遲綁定】的出現,它不可能真正地扔掉標識符,某些時候仍然需要用標識符來尋找綁定。


至於題主的問題,從上面的分析可以看出

  • 如果沒有用標識符尋找綁定的過程,對性能沒有任何影響
  • 如果有,影響最大的因素也應該是【標識符編碼後的長度】,當然,utf-8編碼下,非ascii字元確實比ascii字元要長,不過用python這種語言的時候,根本無需糾結這點性能。

另外,有些人不喜歡用非ascii字元做標識符,這無可厚非。但標識符這東西,只要你自己、和你合作的人看得懂、看得舒服就可以。別人怎麼說,不太重要。


實際上,最直接的方法是測試長短變數名語句運行時間的差別。可以設計以下代碼:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import timeit
sum1 = 0.0
sum2 = 0.0
loop = 10
repeats = 1000000000 # 10的9次方
timeit.timeit(c=5, number=100)
for i in range(loop):
sum1 += timeit.timeit(a=1, number=repeats)
sum2 += timeit.timeit(一個非常長的變數名可能你一行顯示不完要拖動滾動條才能完整看到這種變數名很不酷而且違反了至少兩條命名規範但是這從語法上是允許的=2, number=repeats)
print(sum1/loop)
print(sum2/loop)

輸出是(因為系統的性能不同,輸出會不一樣):

10.946127592100002
10.956204665800001

稍微計算一下可以發現,兩者的差別相對於賦值語句自身消耗的時間,大概在千分之一左右。在我的系統上,絕對時間差別大概是十的負11次方秒(光大概行進了3毫米)。


不會有影響,可以做如下實驗:

import dis
def a(s):
return s+1

def 這個函數的名字很長(參數的名字也非常長):
return 參數的名字也非常長+1

dis.dis(a)
dis.dis(這個函數的名字很長)

可以看到兩個函數的彙編碼完全一樣:

10 0 LOAD_FAST 0 (s)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 RETURN_VALUE
13 0 LOAD_FAST 0 (參數的名字也非常長)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 RETURN_VALUE

實際上,所有變數名函數名等名稱,在轉成位元組碼後,只是一個個地址,名稱只是在寫代碼的時候增加可讀性。

在實際的項目中,尤其是多人協作的項目中,可能會有編碼規範來要求統一命名規則,比如,有些項目要求類似這種變數命名規則:lower_case_with_underscores

好的編碼規範可以在多人協作時降低溝通成本,對於個人來說,養成較好的命名習慣也有利於之後閱讀和修改代碼。


關於用中文做變數名函數名和不懂英語再多說一句。很多第一手資料是英文的,甚至有很多問題,用英文搜索你會更快得到解答。但是我覺得白貓黑貓,只要能抓到老鼠就是好貓;同樣,編程是用來解決問題的,可能不是100分,但是你把問題解決了,總強過不能解決問題的。

建議英語還是要學習一下,因為如果需要到大的項目工作,不可能別人來遷就你,大家都用中文來命名變數。不過一些個人的項目就無所謂了。

熱愛編程是值得鼓勵的,可能在這個過程中,你的英語也會得到提高。Good luck!


你就不怕出亂碼嗎... 整到別的電腦上要是字元編碼不同就全是亂碼

哪怕你用拼音也行啊(雖然極不推薦)


不會影響性能。

如果你能確保看你代碼的人都懂中文,那這樣就挺好。不用強行用英文變數。


不會影響執行效率,但是會影響編碼效率,輸入法要切來切去。


想的太多,做的太少。

會不會影響性能你直接寫個循環跑個100萬次,馬上就知道了。

另外不會編程你知道去學,不會英文為什麼就不知道去學呢?


小夥伴,您好,如果您執意這樣下去的話,編程真的離你越來越遠了。

我的專欄,歡迎隨時交流:https://zhuanlan.zhihu.com/everyday-lin
推薦閱讀:
相關文章