Что более эффективно, чем логические операторы np.sum и numpy? - PullRequest
0 голосов
/ 13 июля 2020

У меня проблемы с быстрым запуском моего кода.

После использования построчного профилировщика в моем коде я обнаружил, что в следующих строках происходит большая часть моей неэффективности:

import numpy as np
import datetime

timestamps = np.array(timestamps)
mask = (minTime <= timestamps) & (timestamps <= maxTime)
count = np.sum(mask)

timestamps начинается как список значений даты и времени, а minTime - это одно значение даты и времени.

Пример значения для временных меток:

minTime = datetime.datetime(2020, 5, 21, 2, 27, 26)

timestamps = [datetime.datetime(2020, 5, 21, 2, 27, 26), datetime.datetime(2020, 5, 21, 2, 27, 26), 
 datetime.datetime(2020, 5, 21, 2, 27, 26), datetime.datetime(2020, 5, 21, 2, 30, 55),
 datetime.datetime(2020, 5, 21, 2, 30, 55), datetime.datetime(2020, 5, 21, 2, 30, 55),
 datetime.datetime(2020, 5, 21, 2, 34, 26), datetime.datetime(2020, 5, 21, 2, 34, 26),
 datetime.datetime(2020, 5, 21, 2, 34, 26), datetime.datetime(2020, 5, 21, 2, 39, 26),
 datetime.datetime(2020, 5, 21, 2, 39, 26), datetime.datetime(2020, 5, 21, 2, 39, 26)]

Есть ли более эффективный способ переписать приведенный выше код?

Любые советы приветствуются.

1 Ответ

1 голос
/ 13 июля 2020

Похоже, numpy.datetime64 объекты довольно быстрые. Примерно в 2 раза быстрее стандартной библиотеки datetime. Pandas здесь барахтаются вроде. Он работает немного лучше, чем то, что вы видите ниже, если вы используете временные метки pandas в качестве индекса для объекта Series и применяете метод доступа .loc. Но не намного лучше. отклонение 7 прогонов, 100000 циклов в каждом)

%%timeit
counter(np_64s, min_npdt, max_npdt)

7,42 мкс ± 102 нс на л oop (среднее ± стандартное отклонение 7 прогонов, 100000 циклов каждое)

%%timeit
counter(pd_tss, min_pddt, max_pddt)

531 мкс ± 2,99 мкс на л oop (среднее ± стандартное отклонение из 7 прогонов, 1000 циклов в каждом)

...