Какой из них лучше для перестановки строк в Python 3? - PullRequest
0 голосов
/ 25 июня 2018
s="google"
print("".join(reversed(s)))  //elgoog
print(s[::-1])  //elgoog

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

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Когда вы говорите об эффективности, вы должны указать, с какой точки зрения? Память, время выполнения, реализация и т. Д.

Что касается времени выполнения, обратная индексация определенно быстрее, потому что когда вы используете join плюс reversed, вы вызываете две функции, каждая из которых имеет свои недостатки (приостановка и возобновление фрейма функции и т. Д.) По сравнению с простой индексации. Но если вы хотите перебрать символ один за другим для любой цели, и память является проблемой (в основном, когда строка большая), вы можете использовать reversed, потому что он возвращает объект итератора.

In [2]: s = "example"

In [4]: r = reversed(s)

In [5]: next(r)  # e.g. You can access to the characters using `next()`
Out[5]: 'e'

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

0 голосов
/ 25 июня 2018

Нет существенной разницы в эффективности памяти.Поскольку строки являются неизменяемыми, оба подхода должны копировать все данные.

Для проверки производительности вы можете использовать модуль timeit в стандартных библиотеках.Слайсинг выполняется значительно быстрее, благодаря избежанию итерации в коде Python:

>>> s = "google"
>>> %timeit "".join(reversed(s))
612 ns ± 20.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> %timeit s[::-1]
157 ns ± 3.96 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

И улучшается время выполнения для больших строк:

>>> s = s*1000
>>> %timeit "".join(reversed(s))
119 µs ± 2.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit s[::-1]
10.8 µs ± 123 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

CPython 3.7.0b4 на macOS.

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