В настоящее время я имею дело с огромным количеством данных в оригинальной форме списка через комбинацию. Я выполняю условия для каждого набора списка через цикл for. Проблема в том, что этот небольшой цикл занимает несколько часов с данными. Я хочу оптимизировать скорость, изменив некоторые функции или векторизовав ее.
Я знаю, что одно из самых больших НЕТ - это не выполняйте операции Pandas или Dataframe для циклов, но мне нужно суммировать столбцы и организовать их немного, чтобы получить то, что я хочу. Это кажется неизбежным.
Итак, у вас есть лучшее понимание, каждый список выглядит примерно так, когда он создается в кадре данных:
0
Name Role Cost Value
0 Johnny Tsunami Driver 1000 39
1 Michael B. Jackson Pistol 2500 46
2 Bobby Zuko Pistol 3000 50
3 Greg Ritcher Lookout 200 25
Name Role Cost Value
4 Johnny Tsunami Driver 1000 39
5 Michael B. Jackson Pistol 2500 46
6 Bobby Zuko Pistol 3000 50
7 Appa Derren Lookout 250 30
Это текущий цикл, есть идеи?
for element in itertools.product(*combine_list):
combo = list(element)
df = pd.DataFrame(np.array(combo).reshape(-1,11))
df[[2,3]] = df[[2,3]].apply(pd.to_numeric)
if (df[2].sum()) <= 5000 and (df[3].sum()) > 190:
df2 = pd.concat([df2, df], ignore_index=True)
Пара вещей, которые я сделал, которые отрезаны некоторое время, но не достаточно.
*df[2].sum() to df[2].values.sum
---- быстрее
*, где concat находится в операторе if, который я пытался использовать, добавляя, а также добавляя фрейм данных вместе в виде списка ... concat обычно на 2 секунды быстрее, как обычно, или в итоге он будет иметь примерно ту же скорость.
* на .apply(pd.to_numeric)
изменил его на .astype(np.int64)
, это также быстрее.
В настоящее время я также смотрю на PYPY и Cython, но я хочу начать здесь прежде, чем начну испытывать головную боль.