从短变量名称中可以获得什么?

时间:2012-08-24 09:21:11

标签: python interpreted-language

通过在像python这样的语言中使用更短的变量名,有什么东西可以通过记忆和速度获得吗?

如果是这样,那么考虑这种情况会是什么样的情况呢?

注意

我绝不提倡短变量名称,我只是想知道,请(重新)阅读这个问题。

注2 请,我确实理解描述性变量名称的价值。我已经查看了足够多的代码来比较简短的名称更喜欢描述性名称,并理解它的价值。普通的否真的没有帮助。

6 个答案:

答案 0 :(得分:21)

没有。 No. No. No.。

没有

使用可读名称,而不是短名称。性能差异绝对是可以忽略不计的。


$ 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次。

答案 1 :(得分:13)

“像python”有问题,因为并非所有的解释语言都是相同的。

使用纯粹解释的语言比具有预编译步骤的Python更具有影响力。严格来说,这不是语言差异(你可以有一个预编译的Javascript引擎,而不是一个,但它确实影响了这个问题的答案。

延伸“像python”以包含每种解释语言,我会说答案是“是的,对于其中一些人来说,至少在某些时候”。接下来的问题是“多少”。

1997年到1998年初,我正在研究一些相当复杂的javascript代码,它利用了Netscape Navigator 4和Internet Explorer 4的一些新功能。这是一个非常庞大的javascript文件 - 当时流行的拨号意味着每千字节计算在站点速度方面。

出于这个原因,我们使用了最小化脚本。这样做的主要原因是重新编写变量(lastHeight变为auserSel变为b等等。

它不仅减少了下载时间,而且还使得较重的功能之一明显加快。但是,如果你是一个在整个工作日都没有看到其他东西的人,那只会很明显,这几乎意味着我和另一位同事。

所以,是的,如果我们将Javascript放入“类似python”类别,就解释而言,那么它可以在以下条件下产生影响:

  1. 它是在Pentium,Pentium Pro和486s上运行的(Pentium II当时没有,但我们没有)。我在整个项目中获得了一台新机器,这意味着我从133MHz到166MHz。
  2. 这是一个相当大的令人讨厌的循环(大多数剧本没有明显的区别)。
  3. 从15年前开始在脚本引擎上运行,自那时起,脚本引擎性能没有任何改进。
  4. 它仍然没有那么大的差别。

    我们可以假设,其他一些解释性语言也会受到类似程度的影响。

    即使在1997年,如果不是巧合地给了我另一个优势,我也不会感到困扰,我当然不会在最小化版本上工作。

答案 2 :(得分:2)

如果你的意思是“像Python这样的语言”的解释语言,那么它会有所作为,因为解析可能需要更长的时间。我说的差别是不明显的。

我完全同意夜间骇客;不要这样做。让您的代码对人类可读。让解析器/编译器处理机器的可读性。

请记住有关优化的规则:

  1. 不要这样做。
  2. (仅限专家)尚未做到。

答案 3 :(得分:2)

对于短循环索引以及变量短暂时,您应该使用短变量名

否则请使用描述性名称,但请勿过度使用,请不要使用Hungarian notation

答案 4 :(得分:1)

几乎没有。不可否认,当python预编译脚本时,第一次查找变量名可能会减慢速度。但是,由于短变量名称导致的混淆所花费的时间通常远远超过执行脚本所节省的时间。

答案 5 :(得分: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))

我们得到了数据:

  • Long = 12.362802280999858
  • 短= 11.445085418999952

大约有8%不同。

在模块(number = 100000000)内运行,而不是使用timeit

  • Long = 24.87908697128296
  • 短= 24.695187091827393

大约1%不同。

我得出结论,内联代码可能存在差异,或者timeit探查器的复杂性(timeit似乎要慢50倍左右),但Cpython似乎做得很好。任何差异。我不能说这对于一个有更多成员的班级是否仍然适用,因为dict会有更多的桶。