Форум сайта python.su
list(zip(*np.unique(text, return_counts=True)))
Отредактировано marina932 (Окт. 12, 2016 04:31:16)
Офлайн
У вас на входе numpy массив? или вы так назвали список?
Вам там точно list нужен?
Может zip на dstack поменять?
PS. Нужно больше кода.
Отредактировано noob_saibot (Окт. 12, 2016 07:55:37)
Офлайн
noob_saibotИ данных :)
PS. Нужно больше кода.
#include <iostream> #include <iomanip> using namespace std; const int N=100000000; const int M=256; static unsigned char arr[N]; int main() { int count[M]={0}; int i; for(i=0;i<N;++i){arr[i]=i;} for(i=0;i<N;++i){++count[arr[i]];} for(i=0;i<M;++i) { cout<<count[i]<<endl; } cout<<"done"<<endl; return 0; }
Отредактировано doza_and (Окт. 12, 2016 08:44:42)
Офлайн
alphabet состоит из 10 символов, size = 100 000 000
text = np.random.choice(list(alphabet.keys()), p=list(alphabet.values()), size=length)
noob_saibotМне кажется нет смысла, потому на выходе у меня всего 10 символов будет + для каждого будет указана частота появления в коде.
Может zip на dstack поменять?
Отредактировано marina932 (Окт. 12, 2016 12:09:38)
Офлайн
doza_and
Си это конечно хорошо и быстро, но хотел обойтись python, на нем все таки пишу.
Офлайн
marina932Вы же в курсе почему doza_and написал на си?
doza_andСи это конечно хорошо и быстро, но хотел обойтись python, на нем все таки пишу.
Офлайн
noob_saibot
Да знаю, что можно расширения на си писать, но все же не хотелось бы это делать. Если без этого ни как вообще, то думаю лучше будет cython использовать.
Офлайн
В общем частично решила проблему тем, что теперь считаю частоту появления символов не в итоговом массиве, а у каждой части общего массива, который генерится в отдельном потоке.
Отредактировано marina932 (Окт. 12, 2016 18:41:36)
Офлайн
У меня машина медленная, поэтому результаты по абсолютному времени могут различаться:
import random import numpy as np def create_text(length): alphabet = {str(i-1): np.float64(i / 55.0) for i in range(1, 11)} return np.random.choice(list(alphabet.keys()), p=list(alphabet.values()), size=length) text = create_text(100000000) text, len(text)
def f_prev(text): l1 = np.unique(text, return_counts=True) l2 = zip(*l1) l3 = {code: count for code, count in l2} return l3
def f_view(text): l1 = np.unique(text.view(np.int), return_counts=True) l2 = zip(*l1) l3 = {chr(code): count for code, count in l2} return l3
f_prev(text)
f_prev(text) == f_view(text)
%%timeit -n 5 f_prev(text)
%%timeit -n 5 f_view(text)
Офлайн
странно, а я думал, что все методы numpy дико оптимизированы:
%%cython -a #cython: boundscheck=False import numpy as np cimport numpy as np cpdef trivial1_cyth1(text): cdef int[:] text_int_view = text.view(np.int) cdef int[:] c = np.zeros(256, dtype=np.int) cdef int l = len(text_int_view ) cdef int i for i in range(l): c[text_int_view [i]] += 1 return {chr(i): c[i] for i in range(len(c)) if c[i] > 0}
text, len(text)
%%timeit trivial1_cyth1(text)
def f_prev(text): l1 = np.unique(text, return_counts=True) l2 = zip(*l1) l3 = {code: count for code, count in l2} return l3
%%timeit -n 5 f_prev(text)
res = trivial1_cyth1(text) res_prev = f_prev(text) res == res_prev
Отредактировано izekia (Ноя. 8, 2016 04:26:59)
Прикреплённый файлы:
alph.JPG (46,1 KБ)
Офлайн