У меня есть список начальных координат на одной хромосоме для объектов фиксированного размера, и я пытаюсь создать объект PyRanges.
Я рассчитал время генерации объекта PyRanges по списку из 125 координат, и это заняло около 3,5 мс. Это оказалось медленнее, чем ожидалось (я впервые использую эту библиотеку), поэтому я попытался измерить скорость одного и того же процесса в списке разного размера.
Вот результаты тестов производительности:
N = 1: 3.03ms
N = 10: 2.96ms
N = 100: 3.33ms
N = 125: 3.24ms
N = 200: 3.11ms
N = 500: 3.12ms
N = 10000: 6.86ms
N = 100000: 32.6ms
Похоже, что для создания объекта PyRanges требуется базовое время (при N = 1 это все еще занимает некоторое время), а затем, хотя время, кажется, зависит от количества функций, отношение не кажется слишком резкий. Действительно, создание объекта PyRanges из 10000 элементов занимает всего в 2 раза больше времени, чем создание объекта всего из 10.
Это код, который я использую:
chr = "chrX"
size = 10
N = 1
points = np.array([random.randint(0, 1000000) for i in range(N)])
genomic_range = pr.PyRanges(
chromosomes= chr,
starts = points,
ends = points + size - 1
)
Я делаю что-то неправильно? Почему создание PyRange занимает это время даже для нескольких элементов?
Я добавил код.
Короче говоря, PyRanges использует Pandas внутри, что очень медленно для небольших входных данных..
Вызов функции идет в _init
, который вызывает create_pyranges_df
, который сам выполняет следующую строку:
chromosomes = pd.Series([chromosomes] * len(starts), dtype = "category")
Эта строка занимает на моей машине 0,25 мс, что очень медленно для такого очень маленького ввода (я ожидаю, что это будет как минимум в 100 раз быстрее). dtype = "category"
, кажется, причина, почему он медленный.
Самая медленная часть кода находится здесь:
for s in columns:
if isinstance(s, pd.Series):
s = pd.Series(s.values, index=idx) # This line is executed several time
else:
s = pd.Series(s, index=idx)
series_to_concat.append(s)
Наличие 10 столбцов и ~ 0,2 мс для создания каждого объекта pd.Series
приводит к тому, что ~ 2 мс тратится почти на ничегонеделание...
Можете ли вы добавить минимальный пример воспроизводящий для своего теста, чтобы мы могли легко попытаться воспроизвести проблему на нашей машине?