Существуют синтаксические изменения, которые вы можете внести, чтобы ускорить процесс, например, замена функций Sum и Prod встроенными эквивалентами sum(x[3] for x in iterable)
и reduce(operator.mul, iterable)
- обычно быстрее использовать встроенные функции или выражения генератора, чем явные петли.
Насколько я могу сказать строку:
if set([e[1]]).issubset(a[i]): # Keep triads which contain the whole edge (i.e. both nodes on the edge)
проверяет, есть ли число в списке. Замена его на if e[1] in a[i]:
устранит накладные расходы на создание двух set
объектов для каждого сравнения.
Кстати, вам не нужно перебирать значения индекса массива, если вы собираетесь использовать этот индекс только для доступа к элементам. например замена
for i in range(0,len(a)):
if set([e[1]]).issubset(a[i]): # Keep triads which contain the whole edge (i.e. both nodes on the edge)
TriNei.append(a[i])
с
for x in a:
if set([e[1]]).issubset(x): # Keep triads which contain the whole edge (i.e. both nodes on the edge)
TriNei.append(x)
Однако я подозреваю, что подобные изменения не будут иметь большого значения для общего времени выполнения. Для этого вам нужно либо использовать другой алгоритм, либо перейти на более быстрый язык. Вы можете попробовать запустить его в pypy - в некоторых случаях он может быть значительно быстрее, чем CPython. Вы также можете попробовать cython , который скомпилирует ваш код в C и иногда может дать большой выигрыш в производительности, особенно если вы аннотируете свой код информацией о типах cython. Я думаю, что самое большое улучшение может произойти из-за изменения алгоритма, который делает меньше работы, но у меня нет никаких предложений для этого.
Кстати, почему цикл 800000 раз? Каково значение этого числа?
Также, пожалуйста, используйте значимые имена для ваших переменных. Использование односимвольных имен или shrtAbbrv совсем не ускоряет код и очень усложняет понимание того, что он делает.