У меня есть модель, критичная ко времени, которую я написал на 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.Я хотел бы получить значительное увеличение скорости без установки длины выходного массива, но я с радостью оставлю эту надежду, если она сдерживает меня.
Я также пытался использовать C ++ в Cython, чтобы использовать структуры данных C ++ (вектор, очередь и т. Д.), Но это лишает меня возможности красиво импортировать журнал.В документации / вики по Cython я вижу, что вы можете написать модуль 'shim' для использования функций на чистом C в C ++ Cython, но я понятия не имею, как это сделать, и я не могу ничего найти о том, как это сделать.
В любом случае, я приветствую все предложения, которые придерживаются моего вопроса:
Каков наилучший способ построения списка / массива / вектора неизвестного размера в Cython?Или есть четкая альтернатива (например, урегулирование с помощью итеративного объекта известной длины), которая делает спор моей проблемой неизвестной длины?
Обновление
Контейнеры C ++ продемонстрировали увеличение скорости по сравнению с назначением элементов, а назначение элементов действительно показало увеличение скорости по сравнению с добавлением в списки и массивы.Лучший способ - использовать контейнеры C ++, в то же время имея возможность импортировать функции pure-C ... это предотвратит замедление от необходимости искать за пределами libc.math функцию быстрой регистрации.