Наиболее эффективный способ построить 1-D массив / список / вектор неизвестной длины с помощью Cython? Или если это никогда не будет сделано?

У меня есть критическая модель времени, которую я написал в Cython. Главный Функция моего расширения Cython имеет один цикл, и, согласно Profiler 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. Я хотел бы получить большую скорость, не устанавливая длину выходного массива, но я с удовольствием бросим, ​​что H ОПЕ, если он держит меня назад.

Я также пытался идти с C ++ в Cython, чтобы использовать структуры данных C ++ (вектор, очередь и т. Д.), Но это удаляет мою способность к красивому журналу Cimport. Я вижу на документации / Wiki Cython, которую вы можете написать модуль «Shim» для использования функций Pure-C в C ++ Cython, но я понятия не имею, как это сделать, и я не могу ничего найти о том, как идти об этом.

В любом случае, я приветствую все предложения, которые придерживаются моего вопроса:

Какой лучший способ построить список / массив / вектор неизвестного размера в Cython? Или есть ли четкая альтернатива (например, урегулирование с известной длиной доставляющего объекта), что делает споровную проблему моей неизвестной длины?

Обновление

Контейнеры C ++ показали скорость увеличения по назначению на элемент, а назначение товара Покажите увеличение скорости на добавлении к спискам и Numpy массивов. Лучший метод будет использовать контейнеры C ++, а также возможность Cimport Pure-C ... это предотвратит замедление, чтобы посмотреть за пределы libc.math для быстрого журнала.

10
задан mdscruggs 19 September 2011 в 15:19
поделиться