python - 为什么在 Python 中创建一个类比实例化一个类要慢得多?

标签 python performance class memory-management

我发现创建类比实例化类要慢得多。

>>> from timeit import Timer as T
>>> def calc(n):
...     return T("class Haha(object): pass").timeit(n)

<<After several these 'calc' things, at least one of them have a big number, eg. 100000>>

>>> calc(9000)
15.947055101394653
>>> calc(9000)
17.39099097251892
>>> calc(9000)
18.824054956436157
>>> calc(9000)
20.33335590362549

是的,创建 9000 个类需要 16 秒,并且在随后的调用中变得更慢。

还有这个:

>>> T("type('Haha', b, d)", "b = (object, ); d = {}").timeit(9000)

给出相似的结果。

但实例化不会受到影响:

>>> T("Haha()", "class Haha(object): pass").timeit(5000000)
0.8786070346832275

5000000 个实例在不到一秒的时间内完成。

是什么让创作如此昂贵?

以及为什么创建过程变慢了?

编辑:

如何重现:

启动一个新的 python 进程,最初的几个“calc(10000)”在我的机器上给出了 0.5 的数字。并尝试一些更大的值,calc(100000),它甚至不能在 10 秒内结束,中断它,然后 calc(10000),给出 15 秒。

编辑:

补充事实:

如果你在 'calc' 变慢后 gc.collect() ,你可以在开始时获得'正常'的速度,但在随后的调用中时间会增加

>>> from a import calc
>>> calc(10000)
0.4673938751220703
>>> calc(10000)
0.4300072193145752
>>> calc(10000)
0.4270968437194824
>>> calc(10000)
0.42754602432250977
>>> calc(10000)
0.4344758987426758
>>> calc(100000)
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "a.py", line 3, in calc
    return T("class Haha(object): pass").timeit(n)
  File "/usr/lib/python2.7/timeit.py", line 194, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
KeyboardInterrupt
>>> import gc
>>> gc.collect()
234204
>>> calc(10000)
0.4237039089202881
>>> calc(10000)
1.5998330116271973
>>> calc(10000)
4.136359930038452
>>> calc(10000)
6.625348806381226

最佳答案

这可能会给你直觉:

>>> class Haha(object): pass
...
>>> sys.getsizeof(Haha)
904
>>> sys.getsizeof(Haha())
64

类对象的结构比该类的实例复杂和昂贵。

关于python - 为什么在 Python 中创建一个类比实例化一个类要慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072428/

相关文章:

python - Python 缺少 frozen-dict 类型的解决方法?

c++ - 对 2 个 "linked"数组进行排序的更好方法?

javascript - javascript 是否不够快来进行流体模拟?

python - 如何将值作为索引的函数赋值给 numpy 数组?

swift - 具有静态方法的服务对象的结构、类或枚举?

python - 在不使用列表、集合等的情况下在 Python 中生成唯一数字

python - Ubuntu 11.10 + Bash + Python 错误 + 无效的 python 安装

java - 类之间调用特定方法

Java:获取类中的所有对象

Python 具有特定文件大小范围的文件数量