несколько комментариев о вашем коде:
- все эти
global
переменные пугают меня! что не так с передачей параметров и возвращением состояния?
- вы не используете никаких функций из
Pandas
, создание фрейма данных только для того, чтобы использовать его для немой итерации по строкам, заставляет его выполнять много ненужной работы
- стандартный модуль
csv
(может использоваться с delimiter='|'
) обеспечивает гораздо более тесный интерфейс, если это действительно лучший способ сделать это
это может быть лучший вопрос для https://codereview.stackexchange.com/
просто играю с исполнением альтернативных способов работы с рядами. Снизу кажется, что работа с «рядами» в основном всегда медленна с пандами
начнем с создания кадра данных, чтобы проверить это:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(1, 1e6, (10_000, 2)))
df[1] = df[1].apply(str)
это занимает 3,65 мс для создания кадра данных со столбцами int
и str
. затем я пробую iterrows
подход:
tot = 0
for i, row in df.iterrows():
tot += row[0] / 1e5 < len(row[1])
агрегация довольно тупая, я просто хотел что-то, что использует оба столбца. это занимает страшные длинные 903 мс. затем я пытаюсь повторить вручную:
tot = 0
for i in range(df.shape[0]):
tot += df.loc[i, 0] / 1e5 < len(df.loc[i, 1])
, что уменьшает это значение до 408 мс. затем я пытаюсь apply
:
def fn(row):
return row[0] / 1e5 < len(row[1])
sum(df.apply(fn, axis=1))
, что в основном то же самое при 368 мс. наконец, я нахожу некоторый код, которым Пандас доволен:
sum(df[0] / 1e5 < df[1].apply(len))
, что занимает 4,15 мс. и еще один подход, который произошел со мной:
tot = 0
for a, b in zip(df[0], df[1]):
tot += a / 1e5 < len(b)
, что занимает 2,78 мс. пока другой вариант:
tot = 0
for a, b in zip(df[0] / 1e5, df[1]):
tot += a < len(b)
занимает 2,29 мс.