迭代多个列表(没有性能下降)

时间:2014-02-04 22:11:41

标签: python performance list

我正在写一个游戏而在中,而True:循环我有一个重新绘制游戏状态的代码。

我有几个不同种类的物品清单(宇宙飞船,横梁,星星) - 所有这些都是为了提高性能。

我需要把它们都画出来。我能做到:

for spaceship in spaceships:
    screen.blit(spaceship.image, (spaceship.x, spaceship.y))
for beam in beams:
    screen.blit(beam.image, (beam.x, beam.y))
...

但我觉得这有点违背DRY原则。我觉得它可以做得更好。

我需要的是这样的结构:

for actor in spaceships + beams + stars:
    actor.move()
    screen.blit(actor.image, (actor.x, actor.y))

但是一个人不会加入他们(也不会做任何会降低性能的事情)。你的想法?

1 个答案:

答案 0 :(得分:6)

使用itertools模块中的chain

from itertools import chain
for actor in chain(spaceships, beams, stars):
    actor.move()
    screen.blit(actor.image, (actor.x, actor.y))

来自文档:

  

创建一个迭代器,返回第一个iterable中的元素,直到   它耗尽,然后进入下一个迭代,直到所有的   迭代用尽了。用于处理连续序列   单一序列。

chain使用延迟评估(例如,没有创建中间列表),因此不会有任何性能下降。