Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2016 15:48:32

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать буфер FIFO для массивов numpy?

В процессе вычислений получаются одномерные массивы numpy одной и той длины. Длина их при программировании не известна, зато известна перед началом вычислений. Их надо засовывать в буфер FIFO с заранее известной длиной, например 1000. При этом ещё надо извлекать из произвольного места буфера. Засовывать и читать надо быстро, без переписывания всего буфера и медленного поиска под ковром.

Офлайн

#2 Окт. 1, 2016 17:04:57

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать буфер FIFO для массивов numpy?

В припадке безумия сделал это:

 #!/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 "---------------------------"
Чем то это мне не нравится.

Отредактировано alien308 (Окт. 1, 2016 17:06:04)

Офлайн

#3 Окт. 1, 2016 18:22:55

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как правильно сделать буфер FIFO для массивов numpy?

alien308
Чем то это мне не нравится.
Интересно вам чем не нравитcя?.

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

Нужна FIFO сделайте класс FIFO. Будете делать в одном numpy массиве или сделаете list из numpy массивов, на быстродействие особо не повлияет. Второе на мой взгляд будет удобнее.



Офлайн

#4 Окт. 2, 2016 19:11:23

alien308
Зарегистрирован: 2012-06-23
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать буфер FIFO для массивов numpy?

Глабальные переменные и print в пробном коде, конечно. Может использование list из numpy массивов позволит исключить копирование в большой numpy массив? Зато будут дополнительные расходы на уборщик мусора. Возможно с такими задачами надо работать с помощью ctypes или cython.

Офлайн

#5 Окт. 2, 2016 20:58:27

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как правильно сделать буфер FIFO для массивов numpy?

alien308
Зато будут дополнительные расходы на уборщик мусора
Откуда они возникнут? вы будете тасовать элементы списка, но из области видимости они не выйдут. Тут нет повода сильно беспокоиться. Эти потери будут ничтожны по сравнению с тем что вам уже дало использование питона.

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

С вашим подходом получается что на ассемблере надо писать.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version