一位同事最近写了一个程序,他用一个Python列表作为队列。换句话说,他在需要插入项时使用.append(x)
,在需要删除项时使用.pop(0)
。
我知道Python有^{},我正试图弄清楚是否要花费我(有限的)时间重写这段代码来使用它。假设我们执行数百万个appends和pop,但从来没有超过几千个条目,那么他的列表使用会成为一个问题吗?
特别是,Python列表实现所使用的底层数组是否会继续无限增长,即使列表只有一千个点,也会有数百万个点,或者Python最终会做一个realloc
并释放一些内存?
Tags:
一些答案声称,当deque vs list都有1000个条目时,它的速度优势是前者的“10倍”,但这有点过头了:
python -mtimeit
是您的朋友——一个非常有用和简单的微基准测试方法!当然,使用它,您还可以在更小的情况下轻松地探索性能:(12个项目与100个项目的btw没有太大区别),在更大的项目中:
您可以看到,deque的O(1)性能声明是有根据的,而一个列表在1000个项目上的速度是原来的两倍多,在10000个数量级左右。您还可以看到,即使在这种情况下,每个append/pop对您只浪费了5微秒左右,并决定这种浪费有多大(尽管如果这就是您对该容器所做的一切,deque没有缺点,所以您最好切换,即使5个usec或多或少不会产生重要影响)。
摘自比兹利的Python Essential Reference, Fourth Edition,第194页:
下面是代码示例:
计时是从我的机器里来的。
2012-07-01更新
使用
list
实现不会耗尽内存,但性能会很差。来自the docs:所以使用
deque
会快得多。相关问题 更多 >
编程相关推荐