Производительность при передаче огромного списка в качестве аргумента в рекурсивной функции?

Я использую Python, и у меня есть рекурсивная функция, которая принимает огромный список в качестве одного из аргументов:

# Current implementation def MyFunction(arg1, arg2, my_huge_list) ... ... MyFunction(new_arg1, new_arg2, my_huge_list) 

Как вы можете видеть выше, MyFunction вызывается рекурсивно, используя тот же список my_huge_list ; это не меняется, в отличие от других аргументов. И, опять же, этот список огромен. Мой друг предположил, что я могу рассматривать my_huge_list как глобальную переменную для повышения производительности, поскольку в противном случае этот огромный список может быть скопирован снова и снова на каждой итерации.

  • Порядок аргументов по умолчанию и не по умолчанию
  • Как передать метод в качестве параметра в Python
  • Функция Python меняет значение переданного параметра
  • Python горит звездочкой в ​​аргументе функции
  • Python. Параметры и возвращаемые значения
  •  # Friend's suggestion MyHugeList=[a,b,c, ...and many many other elements... ] def MyFunction(arg1, arg2) global MyHugeList ... ... MyFunction(new_arg1, new_arg2) 

    Использует ли глобальная переменная, как показано выше, повысить производительность алгоритма над исходной версией? Моя программа работает в течение нескольких недель, поэтому даже небольшое улучшение может быть полезным в долгосрочной перспективе.

  • Как передать элементы кортежей функции в качестве аргументов в python?
  • Python горит звездочкой в ​​аргументе функции
  • Можете ли вы перечислить аргументы ключевых слов, получаемые функцией Python?
  • Как извлечь параметры из списка и передать их вызову функции
  • Функция Python меняет значение переданного параметра
  • Как передать метод в качестве параметра в Python
  • 2 Solutions collect form web for “Производительность при передаче огромного списка в качестве аргумента в рекурсивной функции?”

    Список будет передан по ссылке, поэтому больше не нужно переносить список из 1 пункта по сравнению с списком позиций 100000:

     def null(x): return x longlist = range(100000) shortlist = range(1) longerlist = range(1000000) %timeit null(shortlist) 10000000 loops, best of 3: 124 ns per loop %timeit null(longlist) 10000000 loops, best of 3: 137 ns per loop %timeit null(longerlist) 10000000 loops, best of 3: 125 ns per loop 

    Более длинные списки содержат в них записи 100 кбайт и 1 М, и все же они не занимают значительно больше времени, чем аргументы, чем более короткие списки.

    могут быть другие способы повышения производительности; это, вероятно, не один из них.

    Нет, аргументы в Python передаются по ссылке.
    Точнее – переменные в Python – это просто указатели, в которых хранятся адреса памяти фактических данных. Поэтому, когда переменная-указатель Pythons передается функции – она ​​передается по ее значению-адресу, указывающему на фактические данные, это означает, что переменные, переданные функциям по значению и значению переменных, являются ссылками на объекты.

    Подробнее об этой теме:

    Python - лучший язык программирования в мире.