У меня есть критическая по времени модель, которую я написал на Cython. Основная функция моего расширения Cython имеет один цикл, и, согласно профилировщику Cython (где он показывает количество вызовов Python оттенками желтого), единственная «желтая» часть в настоящее время находится там, где я добавляю к списку Python. (Мне нужно вывести объект Python, поскольку я вызываю свою функцию Cython в скрипте Python). Это основная идея моей функции (остальное лишнее, я проверил каждую часть этой функции, и операция добавления является узким местом):
from libc.math cimport log
def main(some args):
cdef (some vars)
cdef list OutputList = []
# NB: all vars have declared types
for x in range(t):
(do some Cythonic stuff, some of which uses my cimport-ed log)
if condition is True:
OutputList.append(x) # this is the only 'yellow' line in my main loop.
return OutputList # return Python object to Python script that calls main()
К сожалению, я не знаю длину моего выходного массива/списка/вектора (что бы я ни использовал). Тем не менее, я мог бы установить его на 52560, и в конечном итоге я изменил его размер, чтобы уменьшить строку в каком-то другом коде Python. Я хотел бы получить значительный прирост скорости, не устанавливая длину выходного массива, но я с радостью откажусь от этой надежды, если она меня сдерживает.
Я также пытался использовать С++ в Cython для использования структур данных С++ (вектор, очередь и т. д.), но это лишает меня возможности красиво цимпортировать журнал. Я вижу в документации/вики Cython, что вы можете написать модуль 'shim' для использования функций чистого C в C++ Cython, но я понятия не имею, как это сделать, и я не могу найти ничего о том, как это сделать.
В любом случае, я приветствую все предложения, которые придерживаются моего вопроса:
Как лучше всего построить список/массив/вектор неизвестного размера в Cython? Или есть явная альтернатива (например, решение с итерируемым объектом известной длины), которая делает мою проблему неизвестной длины спорной?
Обновить
Контейнеры C++ показали увеличение скорости по сравнению с назначением элементов, а назначение элементов действительно показало увеличение скорости по сравнению с добавлением в списки и массивы numpy. Лучшим методом было бы использование контейнеров C++, а также возможность cимпортировать функции чистого C... это предотвратило бы замедление работы из-за необходимости искать функцию быстрого журнала за пределами libc.math.