基本上我试图避免在我看到这样的代码之前循环遍历大数组:
for rows in book:
bs = []
as = []
trdsa = []
trdsb = []
for ish in book:
var = (float(str(ish[0]).replace(':',"")) - float(str(book[0]).replace(':',"")))
if var < .1 and var > 0 :
bs.append(int(ish[4]))
as.append(int(ish[5]))
trdsa.append(int(ish[-2]))
trdsb.append(int(ish[-1]))
time = ish[0]
bflow = sum(numpy.diff(bs))
aflow = sum(numpy.diff(as))
OFI = bflow - aflow - sum(trdsb) + sum(trdsa)
OFIlist.append([time,bidflow,askflow,OFI])
我不想在列表中循环两次,因为它耗费了太多时间。我以为我可以做列表理解,但我不确定我是否在正确的轨道上
OFIcreate(x,y):
bs = []
as = []
trdsa = []
trdsb = []
var = (float(str(y[0]).replace(':',"")) - float(str(x[0]).replace(':',"")))
if var < .1 and var >= 0 :
bs.append(int(ish[4]))
as.append(int(ish[5]))
trdsa.append(int(ish[-2]))
trdsb.append(int(ish[-1]))
time = ish[0]
bflow = sum(numpy.diff(bs))
aflow = sum(numpy.diff(as))
OFI = bflow - aflow - sum(trdsb) + sum(trdsa)
OFIlist.append([time,bidflow,askflow,OFI])
return OFIlist
OFIc = [ OFIcreate(x,y) for x in book for y in book)
问题是我想循环遍历列表并将所有实例分组,其中var&gt; = 0且var&lt; .1然后将值附加到新列表中。我现在拥有它的方式我不认为它会这样做,因为它将继续创建长度为1的列表。有关如何实现这一目标的任何想法?或者更确切地说,如何让第一个代码块更有效?
答案 0 :(得分:1)
我不想在列表中循环两次,因为它耗费了太多时间。我以为我可以做列表理解,但我不确定我是否在正确的轨道上
可能不是。列表推导除了遍历给定列表之外什么都不做,所以它应该没有明显的区别。
答案 1 :(得分:1)
虽然列表推导确实比常规循环解释得更快,但它们不适用于所有内容。我不认为你可以通过列表理解来替换主for
循环。但是,可能还有一些改进空间:
您可以按列表理解构建time
列表。
time = [ish[0] for ish in book]
您可以按列表推导计算var
列表,并将其转换为np.array
。
var = np.array([t.replace(':',',') for t in time], dtype=float)
var -= float(str(book[0]).replace(":", ","))
您可以为bs
,as
构建4个numpy int数组(您需要重命名,as
是Python关键字)。 ..
然后,您可以使用精美的索引过滤bs
...数组:
bs_reduced = bs[(var < 0.1) & (var >=0)]