Comments 12
В первый раз о таком слышу. Тема оптимизации кода сейчас весьма актуальна. Спасибо. В ближайшее время испробую.
например, если выражение, которое ранее складывало два целых числа, вместо этого начинает объединять две строки
Вот тут не понял. Как это?
Это же Питон
Простите, вы с js перепутали.
Мне кажется, вы хотели иронично пошутить, но вышло не очень.
Во многих языках можно написать функцию, складывающую два типа/объекта, если для этого типа/объекта определенно сложение. В питоне и для строк и для чисел операция сложения определена.
Python 3.10.7 (main, Nov 24 2022, 19:45:47) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def add(a: int, b: int) -> int:
... return a + b
...
>>> add(1, 2)
3
>>> add(3, 4)
7
>>> # Несмотря на аннотации,
>>> # в рантайме может случиться и такое:
>>> add("5", "6")
'56'
«Вот тут не понял. Как это?»
Для Python без разницы что складывать: два числа или две строки. Это указывается одной операцией «+». Также Python без разницы какие типы у переменных, пока он не начал операцию. Если сложение поддерживается типам обоих переменных, то он их сложит. Нет -- покажет ошибку. Поэтому, если он складывает последовательно, например, какие-то пары значений из двух списков, то сначала он может складывать два числа, а потом -- две строки.
Вот тут не понял. Как это?
Мне действия "оптимизатора" тоже не совсем понятны.
Если не ошибаюсь, после первого запуска программы сам Python смотрит в кеше байткода и если ничего не изменилось, то происходит "ускорение" за счёт использования того что есть.
А specialist позволяет показать где можно подправить код для оптимизации действия или даже автоматически увидеть возможность оптимизации какого либо действия и сохранить в байткоде. То есть делает "первый прогон" не просто для кеширования, а для "оптимального кеширования".
например, если выражение, которое ранее складывало два целых числа, вместо этого начинает объединять две строки
В Python можно использовать всё для всёго
# например
def add_two_ints(a, b):
return a + b
c = add_two_ints("a", "b") # c == "ab"
d = add_two_ints([1,2], [3,4]) # d == [1,2,3,4]
# можно конечно с mypy и разными функциями
def add_two_ints(int_1: int, int_2: int) -> int:
return int_1 + int_2
def add_two_floats(float_1: float, float_2): float) -> float:
return float_1 + float_2
# или же понять что именно происходит и написать:
from typing import TypeVar
T = TypeVar('T') #тут можно добавить нужные типы ('T', str, int, float, ...)
def add_two_things(thing_1: T, thing_2: T) -> T:
return thing_1 + thing_2
Всё это не для самого Python, а для mypy, чтобы проверить сходимость типов. Python сам ничего проверять не будет и просто упадёт если что-то пойдёт не так.
Вот тут и стаёт интересно, как именно происходит ускорение, можно ли на него повлиять за счёт тайп хинтов, но, повторюсь, мне это пока не понятно, нужно будет копнуть глубже.
И под конец, стандартный совет, если всё настолько критично критично, то эти самые критичные части лучше ускорять за счёт перезаписи на другом языке.
Это работает?
$ pip install specialist
ERROR: Could not find a version that satisfies the requirement specialist (from versions: none)
ERROR: No matching distribution found for specialist
Представляем specialist — пакет для оптимизаций Python-кода