170 похожих чатов

Count = 100000 start = time.time() s = "" for i in range(count):

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

Ребята, привет. А это в питоне можно преодолеть только поменьше обращаясь к полям классов? Или есть более адекватные варианты?

28 ответов

27 просмотров

e = S.s ... S.s = e

dm- Автор вопроса
r nurnu
e = S.s ... S.s = e

Это понятно. Но это простой пример. С реальным кодом и классами такое возможно далеко не всегда.

dm
Это понятно. Но это простой пример. С реальным код...

Если у тебя в реальном коде циклы с таким количеством итераций, то я тебе соболезную

dm- Автор вопроса
r nurnu
Если у тебя в реальном коде циклы с таким количест...

И сильно побольше бывают) Но неприятно удивил такой оверхед при обращении к полям и методам классов. Хотя наверно не стоит много требовать от скриптового языка. Получше баша в поддержке и то хорошо))

1. Складывать строки - в целом дорого. Подозреваю, что в первом случае сработала оптимизация. 2. Замерять короткие промежутки разницей time.time() - фиговая идея. Точность может оказаться плюс-минус полгода.

dm- Автор вопроса
evle
1. Складывать строки - в целом дорого. Подозреваю,...

Но речь идет не об этом, а о сравнении: сравнении результата второго с первым. А на это перечисленные тобой пункты не должны влиять.

dm- Автор вопроса

А эту дефолтную оптимизацию можно как-то отключить и проверить без нее? Что же касается второго, то замеры делались разными способами. И везде результаты такого же порядка.

dm
Но речь идет не об этом, а о сравнении: сравнении ...

Должны. Оптимизация может банально не срабатывать, когда там атрибут, а не локальная переменная, я не помню, на что там тригерится. А точность - у тебя банально могут случайные результаты с каждым запуском быть. Хорошо если несколько раз запустишь и увидишь. Нет ни одного повода так делать.

dm
А эту дефолтную оптимизацию можно как-то отключить...

Вроде бы нельзя. Мы тут не так давно обсуждали и во-первых не нашли, где она делается, а во-вторых, нашли дискуссию, где авторы питона решили, что отключаемыми такого рода штуки делать сложно и ни к чему.

А не пофиг ли?

dm- Автор вопроса
evle
Должны. Оптимизация может банально не срабатывать,...

Проверялось и на приватных полях. И разными способами через другие методы time, timeit и datetime. Везде результаты такого же порядка. И конечно далеко не на одном запуске.

dm
И сильно побольше бывают) Но неприятно удивил тако...

И ты при этом продолжаешь писать на питоне?

dm- Автор вопроса
Alex
А не пофиг ли?

Бывает нет. Когда циклы на порядки больше приведенного.

Ну и еще вопрос, ты __slots__ используешь в своем классе или нет?

dm- Автор вопроса
Alex
И ты при этом продолжаешь писать на питоне?

Именно поэтому стараюсь и не писать))

dm- Автор вопроса
Alex
Отлично, вот и не пиши

С такими советами ты очень хорош) Но думаю ты прекрасно понимаешь, какие на свете бывают разные задачи и легаси.

dm
С такими советами ты очень хорош) Но думаю ты прек...

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

dm- Автор вопроса
evle
А в список и "".join(...)?

Да, с другими вариантами результаты сильно получше. То есть считаешь таки дефолтные оптимизации так влияют?

dm
Да, с другими вариантами результаты сильно получше...

Я считаю, что не стоит без повода игнорировать давно известные рекомендации и складывать строки в цикле. Влияет ли конкретно здесь добавленная для простых случаев оптимизация - не знаю.

dm- Автор вопроса
evle
Я считаю, что не стоит без повода игнорировать дав...

Но без класса скорость вполне подходит. И бывает даже получше других вариантов. И вот именно эта разница показалась странной.

evle
Я считаю, что не стоит без повода игнорировать дав...

Ну тут то он упирается не в скорость складывания строк, а в доступ к атрибуту объекта

dm- Автор вопроса
dm
Но без класса скорость вполне подходит. И бывает д...

Почему странной? Поиск атрибута в объекте не бесплатная операция.

Alex
Ну тут то он упирается не в скорость складывания с...

Скорость складывания может быть фактором на самом деле.

dm- Автор вопроса
Alex
Почему странной? Поиск атрибута в объекте не беспл...

Понимаю, но не ожидал что настолько дорогая в некоторых случаях

Похожие вопросы

Обсуждают сегодня

Ребят в СИ можно реализовать ООП?
Николай
32
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный TFilestream не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
8
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Карта сайта