Pull to refresh

Comments 12

В первый раз о таком слышу. Тема оптимизации кода сейчас весьма актуальна. Спасибо. В ближайшее время испробую.

например, если выражение, которое ранее складывало два целых числа, вместо этого начинает объединять две строки

Вот тут не понял. Как это?

Простите, вы с js перепутали.

def sum(a, b): return a+b

Будет суммировать и числа, и строки

Мне кажется, вы хотели иронично пошутить, но вышло не очень.

Во многих языках можно написать функцию, складывающую два типа/объекта, если для этого типа/объекта определенно сложение. В питоне и для строк и для чисел операция сложения определена.

Так я удивился вопросу поэтому

Вот именно. Операция сложения не складывала раньше числа, она всегда складывала и числа, и строки, и вообще всё, что складывается.

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

Sign up to leave a comment.