Я пытаюсь сделать датчик, используя Beaglebone Black (BBB) и Python. Мне нужно получить как можно больше данных в секунду с датчика. Приведенный ниже код позволяет мне собирать около 100 000 точек данных в секунду.
import Adafruit_BBIO_GPIO as GPIO
import time
GPIO.setup("P8_13", GPIO.IN)
def get_data(n):
my_list = []
start_time = time.time()
for i in range(n):
my_list.append(GPIO.input("P8_13"))
end_time = time.time() - start_time
print "Time: {}".format(end-time)
return my_list
n = 100000
get_data(n)
Если n = 1 000 000, для заполнения my_list требуется около 10 секунд, что соответствует той же скорости, когда n = 100 000 и время = 1 с.
Я решил попробовать Cython, чтобы получить лучшие результаты. Я слышал, что это может значительно ускорить код Python. Я следовал базовому руководству по Cython: создал файл data.pyx с приведенным выше кодом Python, затем создал setup.py и, наконец, создал файл Cython.
К сожалению, мне это совсем не помогло. Итак, мне интересно, использую ли я Cython неуместно или в этом случае, когда нет «тяжелых математических вычислений», Cython не может слишком помочь. Любые предложения о том, как ускорить мой код, приветствуются!
my_list
на массив? Насколько я понимаю, если содержимое вашего цикла включает только операции над типами C, то цикл будет преобразован в C и будет выполняться относительно быстро; если там все еще есть типы python (например, добавление к pythonlist
), то я думаю, что вам не хватает преимуществ cython - person Ryan   schedule 20.11.2014cython -a <filename>.pyx
, который создаст вывод HTML файл, сообщающий вам, где находятся медленные регионы (они отображаются желтым цветом). docs.cython.org/src/quickstart/ - person Ryan   schedule 20.11.2014