17

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

如果是这样,在什么样的情况下考虑这个是合理的?

笔记

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

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

4

6 回答 6

23

不不不不不不

不。

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


$ 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 微秒。

于 2012-08-24T09:23:49.563 回答
15

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

使用纯解释语言,它比使用具有预编译步骤的 Python 产生更大的影响。严格来说,这不是语言差异(您可以有一个预编译的 Javascript 引擎,也可以有一个不预编译的 Javascript 引擎),但它确实会影响这个问题的答案。

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

从 1997 年到 1998 年初,我正在编写一些相当复杂的 javascript 代码,这些代码利用了 Netscape Navigator 4 和 Internet Explorer 4 的一些新功能。这是一个巨大的 javascript 文件,当时拨号盛行。意味着每千字节都以站点速度计。

出于这个原因,我们使用了 minimiser 脚本。这样做的主要目的是将变量重写为更短(lastHeight变得auserSelbecmomesb等等)。

它不仅减少了下载时间,而且还使较重的功能之一明显更快。但只有当你是一个整天都在看其他东西的人时才有意义,这几乎意味着我和另一位同事。

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

  1. 它在 Pentium、Pentium Pro 和 486s 上运行(当时 Pentium II 已经推出,但我们没有)。我在项目的中途得到了一台新机器,这意味着我从 133MHz 到 166MHz。
  2. 这是一个相当大的令人讨厌的循环(大部分脚本没有明显的区别)。
  3. 它在 15 年前的脚本引擎上运行,此后脚本引擎性能没有任何改进。

它仍然没有那么大的区别。

我们可以假设,其他一些解释性语言也受到同样微小的影响。

即使在 1997 年,如果不是它巧合地给了我另一个优势,我也不会打扰,而且我当然没有在最小化版本上工作。

于 2012-08-24T09:56:19.597 回答
3

如果您通过“Python 之类的语言”这句话来表示解释性语言,那么是的,它会有所作为,因为解析可能需要更长的时间。我想说的区别是不明显的。

不过,我完全同意 nightcracker。不要这样做。使您的代码对人类可读。让解析器/编译器处理机器的可读性。

记住优化规则:

  1. 不要这样做。
  2. (仅限专家)不要这样做。
于 2012-08-24T09:24:01.283 回答
2

您应该对短循环索引和短寿命的变量使用短变量名。

否则使用描述性名称,但不要过度使用,请不要使用匈牙利符号

于 2012-08-24T09:25:49.200 回答
1

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

于 2012-08-24T09:26:26.820 回答
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% 的不同。

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

  • 长 = 24.87908697128296
  • 短 = 24.695187091827393

这大约有 1% 的差异。

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

于 2017-08-25T12:37:38.177 回答