1

基本的に、次のようなコードを作成する前に、大きな配列をループしないようにしています。

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])

時間がかかりすぎるため、リストを2回ループしたくありません。リストの理解ができると思っていましたが、正しい軌道に乗っているかどうかわかりません

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 >=0 および var <.1 のすべてのインスタンスをグループ化し、値を新しいリストに追加することです。私が今持っている方法では、長さが1のリストを作成し続けるだけなので、そうは思わない. これを達成する方法についてのアイデアはありますか? むしろ、コードの最初のブロックをより効率的にするにはどうすればよいでしょうか?

4

2 に答える 2

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(":", ","))
    
  • bsas(名前を変更する必要asがあるのはPythonのキーワードです)の4つのnumpy int配列を構築できます...

  • bs次に、派手なインデックスを使用して ... 配列をフィルタリングできます。

    bs_reduced = bs[(var < 0.1) & (var >=0)]
    
于 2012-09-27T15:14:26.637 に答える
1

時間がかかりすぎるため、リストを2回ループしたくありません。リストの理解ができると思っていましたが、正しい軌道に乗っているかどうかわかりません

おそらくそうではありません。リスト内包表記は、指定されたリストをループするだけなので、目立った違いはありません。

于 2012-09-27T14:48:26.787 に答える