这个问题本质上是学术性的,通常如果我在现实世界中遇到这些问题,我可能会做不同的事情。但是我很好奇是否可以提高创建python对象的速度。
#!/usr/bin/env python
import time
# boring class
class boring:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def timefunc(f):
def f_timer(*args, **kwargs):
start = time.time()
result = f(*args, **kwargs)
end = time.time()
print f.__name__, 'took', end - start, 'time'
return result
return f_timer
@timefunc
def standard_boring():
for x in range(10000000):
b = boring(1,2,3)
del(b)
if __name__ == "__main__":
standard_boring()
在我的机器上大约需要4秒钟。好奇的是Python正在做什么我用strace深入挖掘。
我看到的是成千上万的电话,例如 -
brk(0xe35000) = 0xe35000
brk(0xe34000) = 0xe34000
brk(0xe33000) = 0xe33000
brk(0xe32000) = 0xe32000
brk(0xe31000) = 0xe31000
Man将brk描述为
brk()和sbrk()改变程序中断的位置,即 定义进程数据段的结束(即程序中断) 是未初始化数据段结束后的第一个位置)。 增加程序中断会产生分配内存的效果 处理;减少休息时间会释放记忆。
对此的每次调用可能都是一些循环次数,因此有很多调用的事实让我认为这是需要时间的。
有没有办法告诉python“哟,我将使用大量内存,所以预先分配负载”。我能做那样的事吗?我知道你为什么不愿意,就像我说的那样是学术性的。
我已经尝试了插槽,假设如果我使用更少的内存,那么这应该通过减少重复出现的内存分配请求的本质来提高我的速度。我发现这个结果非常“粗糙”。
有什么想法吗?