0

假设有一个类:

class x(obj):
    y = 1

什么是更快(或首选):

    def __init__(self):
        print self.y

或者:

    def __init__(self):
        print x.y

我认为x.y可以更好地传达意图,但我对速度影响感兴趣。

4

2 回答 2

3

通过这些微优化可能实现的性能提升并不重要。到目前为止,ing的影响使print属性访问的成本相形见绌。作为参考,这是一个测试脚本:

import sys,timeit
class ClassAccess(object):
    y = 1
    def __init__(self):
        print(ClassAccess.y)

class SelfAccess(object):
    y = 1
    def __init__(self):
        print(self.y)

ca = timeit.timeit(ClassAccess, number=100000)
sa = timeit.timeit(SelfAccess, number=100000)

sys.stderr.write(str(ca) + "\n")
sys.stderr.write(str(sa) + "\n")

在我的机器上(使用 yakuake 终端),这个输出

0.640013933182
0.628859043121

这在两个变体相同的实验误差范围内。粗略的实验表明:

  • 大约 90% 的运行时间是由实际显示打印结果引起的。
  • 在其余部分中,大约 50% 是单独打印语句占用的时间。
  • 其余的大约 80%由对象的分配引起的。

因此,可以肯定地说得出性能没有差异的结论。

于 2012-07-19T11:04:33.710 回答
0

请注意,根据类的实现,返回的值可能会有所不同。

这将返回实例的 y 属性:

def __init__(self):
    print self.y

虽然这会返回类的 y 属性:

def __init__(self):
    print x.y

如果构造函数覆盖 y 属性 a la :

def __init__(self, y=None):
    self.y = y
def print(self):
    print self.y

返回的值会有所不同。Python 在检查 y 之前查找实例内部字典以检查类 internat 字典。所以我认为 print xy 应该稍微快一些,因为它避免了查找实例字典。

于 2012-07-19T11:20:26.330 回答