【发布时间】:2015-11-21 19:49:48
【问题描述】:
我正在使用我在使用 for 循环填充时使用的 python 类,当我循环数百万条数据线时它非常慢,显然有一种更快的方法。也许我根本不应该使用一个类,但我需要创建一个结构以便对它进行排序。
这是那个类:
class Particle(object):
def __init__(self, ID, nH, T, metallicity,oxygen,o6,o7,o8):
self.ID = ID
self.nH = nH
self.T = T
self.metallicity = metallicity
self.oxygen = oxygen
self.o6 = o6
self.o7 = o7
self.o8 = o8
这是我在使用 append 读取所有单个数组(ID、nH、T 等)后第一次填充它的方法,这当然非常慢:
partlist = []
for i in range(npart):
partlist.append(Particle(int(ID[i]),nH[i],T[i],metallicity[i],oxygen[i],o6[i],o7[i],o8[i]))
这需要几个小时才能处理 3000 万个值,显然“追加”不是正确的做法。我认为这是一种改进:
partlist = [Particle(int(ID[i]),nH[i],T[i],metallicity[i],oxygen[i],o6[i],o7[i],o8[i]) for i in range(npart)]
但这可能需要同样长的时间,并且在一个小时后还没有完成。
我是 python 新手,使用索引不是“pythonic”,但我不知道如何在几分钟内制作和填充 python 对象。
建议?提前致谢。
【问题讨论】:
-
您需要先了解
range()和xrange()之间的区别,因为3000 万件就是3000 万件。 -
你也可以避免在生成器之前使用
lists。 -
而列表理解只是您已经在做的事情的语法糖。
-
您真的需要列表中的所有
Particle对象,还是一次只使用一个?如果您一次只需要一个值,那么像zip(在 Python 3 中或在 Python 2 中为itertools.izip)这样的生成器可能会更好。 -
列表推导不是语法糖。循环必须反复调用函数
partlist.append;列表推导使用LIST_APPEND字节码添加到正在构建的列表中。
标签: python class object for-loop indexing