s += str(i)
print("time1:", time.time() - start)
class S:
pass
s = S()
start = time.time()
s.s = ""
for i in range(count):
s.s += str(i)
print("time2:", time.time() - start)
time1: 0.03569769859313965
time2: 1.8301658630371094
Ребята, привет. А это в питоне можно преодолеть только поменьше обращаясь к полям классов? Или есть более адекватные варианты?
e = S.s ... S.s = e
Это понятно. Но это простой пример. С реальным кодом и классами такое возможно далеко не всегда.
Если у тебя в реальном коде циклы с таким количеством итераций, то я тебе соболезную
И сильно побольше бывают) Но неприятно удивил такой оверхед при обращении к полям и методам классов. Хотя наверно не стоит много требовать от скриптового языка. Получше баша в поддержке и то хорошо))
1. Складывать строки - в целом дорого. Подозреваю, что в первом случае сработала оптимизация. 2. Замерять короткие промежутки разницей time.time() - фиговая идея. Точность может оказаться плюс-минус полгода.
Но речь идет не об этом, а о сравнении: сравнении результата второго с первым. А на это перечисленные тобой пункты не должны влиять.
А эту дефолтную оптимизацию можно как-то отключить и проверить без нее? Что же касается второго, то замеры делались разными способами. И везде результаты такого же порядка.
Должны. Оптимизация может банально не срабатывать, когда там атрибут, а не локальная переменная, я не помню, на что там тригерится. А точность - у тебя банально могут случайные результаты с каждым запуском быть. Хорошо если несколько раз запустишь и увидишь. Нет ни одного повода так делать.
Вроде бы нельзя. Мы тут не так давно обсуждали и во-первых не нашли, где она делается, а во-вторых, нашли дискуссию, где авторы питона решили, что отключаемыми такого рода штуки делать сложно и ни к чему.
А не пофиг ли?
Проверялось и на приватных полях. И разными способами через другие методы time, timeit и datetime. Везде результаты такого же порядка. И конечно далеко не на одном запуске.
Приватных полей в питоне нет.
И ты при этом продолжаешь писать на питоне?
Бывает нет. Когда циклы на порядки больше приведенного.
Ну и еще вопрос, ты __slots__ используешь в своем классе или нет?
Именно поэтому стараюсь и не писать))
Отлично, вот и не пиши
С такими советами ты очень хорош) Но думаю ты прекрасно понимаешь, какие на свете бывают разные задачи и легаси.
А в список и "".join(...)?
Я прекрасно понимаю, что если у тебя возникает необходимость подобных микрооптимизаций, то есть другие варианты решения проблемы.
Да, с другими вариантами результаты сильно получше. То есть считаешь таки дефолтные оптимизации так влияют?
Я считаю, что не стоит без повода игнорировать давно известные рекомендации и складывать строки в цикле. Влияет ли конкретно здесь добавленная для простых случаев оптимизация - не знаю.
Но без класса скорость вполне подходит. И бывает даже получше других вариантов. И вот именно эта разница показалась странной.
Ну тут то он упирается не в скорость складывания строк, а в доступ к атрибуту объекта
Именно на это и похоже
Почему странной? Поиск атрибута в объекте не бесплатная операция.
Скорость складывания может быть фактором на самом деле.
Понимаю, но не ожидал что настолько дорогая в некоторых случаях
Обсуждают сегодня