Найти - Пользователи
Полная версия: Как правильно сделать буфер FIFO для массивов numpy?
Начало » Python для экспертов » Как правильно сделать буфер FIFO для массивов numpy?
1
alien308
В процессе вычислений получаются одномерные массивы numpy одной и той длины. Длина их при программировании не известна, зато известна перед началом вычислений. Их надо засовывать в буфер FIFO с заранее известной длиной, например 1000. При этом ещё надо извлекать из произвольного места буфера. Засовывать и читать надо быстро, без переписывания всего буфера и медленного поиска под ковром.
alien308
В припадке безумия сделал это:
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import scipy as sp
import math
l_fifo = 4
dim = 2
start = 0
l_fill = 0
fifo_res = np.full((l_fifo, dim), np.NaN)
#push
for i in range(9):
    x = np.array([1.0 + i, 2.0])
    if l_fill >= l_fifo:
        start = start + 1
    else:
        l_fill = l_fill + 1 
    let_pos = (start + l_fill - 1) % l_fifo
    fifo_res[let_pos, :] = x
    print start, l_fill
    print fifo_res
    print "---------------------------"
Чем то это мне не нравится.
doza_and
alien308
Чем то это мне не нравится.
Интересно вам чем не нравитcя?.

Мне ваш код не нравится тем что у вас
  • не используется scipy math
  • Куча глобальных переменных. start l_fifo
  • никому не нужные print

Нужна FIFO сделайте класс FIFO. Будете делать в одном numpy массиве или сделаете list из numpy массивов, на быстродействие особо не повлияет. Второе на мой взгляд будет удобнее.
alien308
Глабальные переменные и print в пробном коде, конечно. Может использование list из numpy массивов позволит исключить копирование в большой numpy массив? Зато будут дополнительные расходы на уборщик мусора. Возможно с такими задачами надо работать с помощью ctypes или cython.
doza_and
alien308
Зато будут дополнительные расходы на уборщик мусора
Откуда они возникнут? вы будете тасовать элементы списка, но из области видимости они не выйдут. Тут нет повода сильно беспокоиться. Эти потери будут ничтожны по сравнению с тем что вам уже дало использование питона.

alien308
Возможно с такими задачами надо работать с помощью ctypes или cython.
Для принятия решения
1) в тех задании определите необходимое быстродействие.
2) прогоните тесты чтобы понять что у вас получается.

С вашим подходом получается что на ассемблере надо писать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB