因为自己英语完全不懂,

所以平时自己写东西都是用中文当变数名啥的,

突然想到这样会不会影响到速度什么的?


首先,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
推荐阅读:
相关文章