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 ответов

14 просмотров

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
Почему странной? Поиск атрибута в объекте не беспл...

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

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

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

Сообщение* в закодированном виде. То есть, просто сделать sendMessage?text=Привет бла-бла! не получится, надо в HEX переводить, и добавлять процент, типа такого: sendMessage?t...
КТ315
21
А случайно нет ли в паскале штатной возможности передать указатель и количество туда где array of в качестве аргумента?
zamtmn
25
Всем привет. Испытываю проблемы в работе БД, а именно огромного роста логов, такого характера: 024-05-16 18:39:07 +05 sentry sentry [unknown] 1050169 7-1 app-sentry01.corp.ru>...
Alexey
2
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
58
Хм. А телеграм апи работают через HTTP?
The Bird of Hermes
14
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Ну раз я пока тут, задам пару глупых вопросов. Зачем писать на ассемблере если компилятор довольно умный, а ассемблер много времени занимает? В каких прикладных задачах сейчас...
Максим Рябцев
20
В дельфе нет никакого коробочного (без установки третьих либ) способа получить CallStack с расшифровкой отладочных символов?
notme
7
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
Карта сайта