Я пытаюсь получить частоту ударов между каждым элементом в списке (получить абсолютное значение разницы между каждым элементом и каждым другим элементом.
, поэтому, если список равен
[a, b, c]
Я хочу сгенерировать
[a, b, c, | ab |, | ac |, | bc |]
но то, что я сейчас делаю (просто перебираю каждый элемент в списке и затем снова перебираю), действительно медленно для числа элементов, с которыми я имею дело, есть ли какая-либо другая структура данных или метод, который я мог бы использовать, чтобы сделать эторабота быстрее?
Код ниже - это то, что я делаю сейчас: я немного новичок в python и не изучил много структур данных за пределами основ, поэтому извините, если решение на самом деле является чем-то действительно очевиднымо котором я не думал!
Я говорил с моим процессором, и он упомянул решетки, это чисто математическая концепция или есть какая-то реализация в коде, которую можно использовать, или это даже что-то, что будетusefuЯ для моего случая?
Вот код, который я сейчас запускаю. Он принимает список частот и амплитуд, где амплитуда частоты на частотах [n] равна амплитудам [n]. Как только найдена уникальная частота биений, она добавляется в список с амплитудой, которая является средним значением амплитуд входных частот, поэтому, если у вас 440 Гц при a = 1 и 110 Гц при a = 2, частота биений будет равна abs(440-110) при а = ((1 + 2) / 2).
def beatSet(frequencies, amplitudes, tol) :
for index_x, x in enumerate(frequencies) :
for index_y, y in enumerate(frequencies[index_x+1:]) :
beat_freq = abs(x - y)
if search(frequencies, beat_freq, tol) : #returns true if beat_freq isn't a duplicate, within a tolerance
frequencies.append(beat_freq)
amplitudes.append((amplitudes[index_y] + amplitudes[index_x])/2)
и функция поиска выглядит следующим образом:
def search(list_in, search_term, tolerance) :
for i in list_in :
if abs(search_term - i) <= tolerance :
return False
return True
Как правило, входной список будет иметь где-то около 10-50 элементов, но выходные данные могут стать действительно большимичто-то вроде [440, 441] сгенерирует выходной список, который будет очень большим, если не было допусков, поэтому допуск является своего рода ограничивающим фактором для размера выходного списка. Как правило, самый большой выходной список генерируется, когда разница двух частот в входном списке чуть выше допуска.
Извините за стену текста, надеюсь, я достаточно подробно все объяснил!