Почему не работает timeit Python?

result = [[], [], [], []]
methods = [
    'method1(texts_array[y])',
    'method2(texts_array[y])',
    'method3(texts_array[y])',
    'method4(texts_array[y])',
]
texts_array = [
    'wergwergwreg',
    'wrggtvxfgafd',
    'hwrthwrthrtb',
    'qerdcjuiuolj',
]


def method1(text):
    print(text + '123' + text)


def method2(text):
    print(text + '123')


def method3(text):
    print(text)


def method4(text):
    print(text + text)


def method_name():
    for x in range(len(methods)):
        for y in range(len(texts_array)):
            result[x].append(timeit.timeit(methods[x], globals=globals(), number=100) / 100)

method_name()

Почему не работает timeit? Появляется ошибка: NameError: name 'y' is not defined.
По идее, я ведь написал globals=globals().
Если двойной цикл вынести из метода, тогда все будет работать, но так не подходит, нужно, чтобы он был в методе.


Ответы (1 шт):

Автор решения: GrAnd

У вас y - это локальная переменная. Её можно передать, объединив globals() c locals(). Но дальше у вашего кода будет ещё много ошибок.

Так что вот рабочий пример:

import timeit

result = []
methods = [
    'method1(text)',
    'method2(text)',
    'method3(text)',
    'method4(text)',
]
texts_array = [
    'wergwergwreg',
    'wrggtvxfgafd',
    'hwrthwrthrtb',
    'qerdcjuiuolj',
]

setup="""
def method1(text):
    print(text + '123' + text)


def method2(text):
    print(text + '123')


def method3(text):
    print(text)


def method4(text):
    print(text + text)
"""

def method_name():
    number = 100
    for method in methods:
        result.append([])
        for text in texts_array:
            result[-1].append(timeit.timeit(method, globals={**globals(), **locals()}, setup=setup, number=number) / number)

method_name()
print(result)
→ Ссылка