0

次の構造の特定の (サード パーティによる、したがって変更不可能な) 入力データがあります。データは 4 タプルのリストであり、各 4 タプルは出撃を表します。各ソーティの最初の要素は、合計 20 の可能なカテゴリ (繰り返しなし) から選択された長さ 1 から 5 のカテゴリのリストです。2 番目の要素は参加者の数です。3 番目は出撃の開始を示す datetime-object です。最後の要素と 4 番目の要素は、出撃の終了を示す datetime オブジェクトです。

次に、このデータを次の形式に変換する必要があります。各カテゴリについて、(a) このカテゴリの出撃回数、(b) 合計消費時間、(c) 出撃ごとの平均時間、(d) を計算する必要があります。 ) 「工数」の合計、すなわち、各出撃の所要時間に同じ出撃の参加者数を乗じた合計、および (e) 出撃ごとの平均「工数」。

私の最初の素朴な試みは次のとおりです。

def transform (data):
    t = defaultdict (lambda: (0, 0, 0) )

    for row in data:
        delta = row [3] - row [2]
        hours = delta.days * 24 + delta.seconds / 3600
        manHours = row [1] * hours
        for cat in row [0]:
            t [cat] = (t [cat] [0] + 1, t [cat] [1] + hours, t [cat] [2] + manHours)

    return {k: (v [0], v [1], v [1] / v [0], v [2], v [2] / v [0] ) for k, v in t.items () }

そして私はそれを次のようにプロファイリングしています:

cats = [_ for _ in range (20) ]
for test in range (1000):
    data = [ (random.sample (cats, random.randint (1, 5) ), random.randint (2, 40), datetime.datetime (2013, 1, 1, 8), datetime.datetime (2013, 1, 1, 9) ) for _ in range (1000) ]
    transform (data)

を使用して-m cProfile

ユーザーが単純な辞書またはリストの理解よりも itertools を使用することを好むようになるまで、パフォーマンスの高い反復処理、グループ化、カウントなどに対する itertools の信じられないほどの利点について、stackoverflow で何度も読みました。

このモジュールを利用したいのですが、最大限に活用する方法がわかりません。したがって:

a) どの方法で変換関数を時間最適化 (高速化) できますか?

b)itertoolsこの努力をどのように助けることができますか?

ご回答ありがとうございます。

--

参考までに: 私のボックス (AMD Phenom II Quad、4 GB RAM、4 GB スワップ)Python 3.3.1 (default, Apr 17 2013, 22:30:32) [GCC 4.7.3] on linuxでプロファイラーを使用すると、次のように出力されます1000 2.027 0.002 2.042 0.002 trans.py:6(transform)。pyhton3 から pypy への移行はオプションではありません。

編集: サンプルデータ(ISO表現を使用)または2番目のコードスニペットを使用して(明らかに実際のものではない)データを作成します:

[([6, 4, 15], 3, '2013-07-31T17:23:00', '2013-07-31T18:40:00'), ([9, 18, 5], 15, '2013-07-08T17:49:00', '2013-07-08T18:57:00'), ([7, 14, 17, 12, 0], 18, '2013-07-20T08:16:00', '2013-07-20T09:06:00'), ([6, 1], 32, '2013-07-31T07:14:00', '2013-07-31T09:01:00'), ([17, 7], 7, '2013-07-05T06:59:00', '2013-07-05T07:52:00')]

2013-08-02: 残念なことに、ピルマンチャーのアイデアをプロファイリングすると、numpy を使用しない場合よりも 360% 遅くなります:

 1000    1.828    0.002    1.842    0.002 prof.py:8(transform) #original function
 1000    0.159    0.000    8.457    0.008 prof.py:43(transform3) #numpy function
4

1 に答える 1