Несколько комментариев о вашем коде:
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 мс.
Тогда, я протестировал свою среднюю кнопку мыши с помощью названного инструмента xev
. Это создает новое окно, которое можно отправить событиям (путем нажатия на него, или нажимающие кнопки), которые пойманы и распечатаны на stdout. Согласно комментарию jpalecek, это может также использоваться для наблюдения других окон вместо нового. Следующее будет наблюдать события из окна Вы выбранный путем нажатия на него:
xev -id $(xwininfo | awk '/Window id/ { print $4 }')
Для сбора общей информации может использоваться xwininfo, который может отобразить детей, атрибуты и т.д.
Я видел функцию "шпиона" от Повидла. Это - инструмент тестирования GUI.