У меня есть список раз (называемый временем в моем коде, созданный кодом, предложенным мне в потоке astropy.io fits efficient element access of a large table), и я хочу сделать некоторые статистические тесты для периодичности, используя тесты Zn^2 и epok folding. Некоторые шаги в коде требуют довольно много времени для запуска, и мне интересно, есть ли более быстрый способ сделать это. Я пробовал эквивалентную карту и лямбда-функции, но это занимает еще больше времени. Мой список раз содержит несколько сотен или, может быть, тысячи элементов, в зависимости от набора данных. Вот мой код:Возможно ли ускорить работу элементарного элемента в Python?
phase=[(x-mintime)*testfreq[m]-int((x-mintime)*testfreq[m]) for x in times]
# the above step takes 3 seconds for the dataset I am using for testing
# testfreq[m] is just one of several hundred frequencies I am testing
# times is of type numpy.ndarray
phasebin=[int(ph*numbins)for ph in phase]
# 1 second (numbins is 20)
powerarray=[phasebin.count(n) for n in range(0,numbins-1)]
# 0.3 seconds
poweravg=np.mean(powerarray)
chisq[m]=sum([(pow-poweravg)**2/poweravg for pow in powerarray])
# the above 2 steps are very quick
for n in range(0,maxn): # maxn is 3
cosparam=sum([(np.cos(2*np.pi*(n+1)*ph)) for ph in phase])
sinparam=sum([(np.sin(2*np.pi*(n+1)*ph)) for ph in phase])
# these steps each take 4 seconds
z2[m,n]=sum(z2[m,])+(cosparam**2+sinparam**2)/count
# this is quick (count is the number of times)
В этом через несколько шагов сто частот по обе стороны от частот, определенных через поиск FFT, это занимает очень много времени для запуска. Такая же функциональность на языке более низкого уровня выполняется гораздо быстрее, но мне нужны некоторые модули Python для построения графиков и т. Д. Я надеюсь, что Python можно убедить выполнить некоторые операции, в частности фазу, фазу, powerarray, cosparam , и вычисления sinparam, значительно быстрее, но я не уверен, как это сделать. Может ли кто-нибудь сказать мне, как это можно сделать, или мне нужно писать и вызывать функции в C или fortran? Я знаю, что это можно сделать за несколько минут, например. в fortran, но этот код Python занимает часы, как есть.
Большое спасибо.
Похоже, '' 'phase''' может быть сделано в два этапа:' '' фаза = (раз-mintime) * testfreq [м]; phase = phase-phase.astype (np.intxx) '' '. '' 'phase''' тогда будет ndarray с той же формой, что и' '' times'''. – wwii
Каждая итерация цикла for присваивает новое значение: '' 'cosparam''' и' '' sinparam''' - это не может быть то, что вы намеревались - они отражают только последнее значение '' 'n''' , – wwii
Да, параметр z2 является важным в этом случае, и он правильно вычисляется из cosparam и sinparam и сохраняется в массиве, чтобы он мог быть сопоставлен с частотой (для каждого значения n) в конце скрипта. Параметры cosparam и sinparam должны быть рассчитаны для каждого значения n и для каждой частоты. Код корректен для расчетов. Я просто хотел бы знать, как заставить его работать быстрее. Благодарю. – dragoncat16