Python разделить на символ против по умолчанию - PullRequest
0 голосов
/ 02 ноября 2019

python библиотечная функция namedtuple из collections со ссылкой https://github.com/python/cpython/blob/master/Lib/collections/init.py

def namedtuple(typename, field_names, *, verbose=False, rename=False, module=None):

    # Validate the field names.  At the user's option, either generate an error
    # message or automatically replace the field name with a valid name.
    if isinstance(field_names, str):
        field_names = field_names.replace(',', ' ').split()

В последней строке кода выше replace(',', ' ').split() отличается от split(','). Мне интересно, в чем причина этого.

Вот тестовый код для измерения затрат времени:

from random import randrange


def create_str(n):
    a = []
    for _i in range(n):
        a.append(str(randrange(101)))

    return ','.join(a)


s = create_str(1000)

# print(s)


def test_a():
    s.split(',')


def test_b():
    s.replace(',', ' ').split()


if __name__ == '__main__':
    import timeit
    print(['test_a: ', timeit.timeit("test_a()", setup="from __main__ import test_a")])
    print(['test_b: ', timeit.timeit("test_b()", setup="from __main__ import test_b")])

Вывод из вышеперечисленного:

['test_a: ', 59.938546671997756]
['test_b: ', 68.51630863297032]

s = create_str(10) получил следующее:

['test_a: ', 0.9246872899821028]
['test_b: ', 1.2178910280345008]

s = create_str(100) получил следующее:

['test_a: ', 6.570624853018671]
['test_b: ', 7.8685859580291435]

test_b быстрее в любом случае.

Обновлено:

https://docs.python.org/3/library/collections.html#collections.namedtuple упомянул следующее:

Имена полей представляют собой последовательность строк, таких как ['x', 'y']. В качестве альтернативы, field_names может быть одной строкой, в которой каждое имя поля разделено пробелами и / или запятыми, например, «xy» или «x, y».

1 Ответ

2 голосов
/ 02 ноября 2019

За исключением разницы во времени выполнения, эти два не делают точно одно и то же.

Рассмотрим строку 'a, b, c'. Использование replace + split приведет к ['a', 'b', 'c'], тогда как разбиение по ',' приведет к ['a', ' b', ' c'].

. Спрашивать, является ли один или другой параметр быстрее или медленнее, в значительной степени не имеет значения, поскольку эти операции(Я имею в виду использование namedtuple()) обычно выполняется во время импорта.

Так что, если вы не генерируете новые типы namedtuple во время выполнения, используя динамически генерируемые строковые (не списочные) имена полей в узком цикле, времяразница тривиальна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...