
Zart
07.07.2016
12:13:38
нет, не интересно
для альтернативных реализаций это вообще неверно
а для цпитона это просто оптимизация скорости для общих случаев

Sergey
07.07.2016
12:14:11
это вопросы оптимизации, зачем это нужно обычному программеру?

Google

Марк
07.07.2016
12:14:17
Так вот, на этапе компиляции в обоих вариантах что происходит?

Zart
07.07.2016
12:14:23
намного важнее знать про оптимизацию работы со встроенными методами
ты вбиваешь в питоне строчку
он её читает, парсит, создает аст, обходит аст, генерит байткод, кормит байткод вм, которая в цикле обходит байткод и исполняет его
ты вбиваешь вторую строчку - происходит то же самое
когда же идёт обход АСТ и надо создать байткод - питон ищет эти самые 100 и 500
для 100 он находит существующие объекты и подставляет референс на них в сгенеренные co_const или как оно там
для 500 нет. поэтому когда
a = 500
b = 500
мы получаем разные объекты
когда же ты пишешь a, b = 500, 500 в одной строке, то при компиляции, сперва для 500 создается новый объект, а для второго 500 находится он же уже тут, в локальном фрейме
поэтому айдишники совпадут

Andrew
07.07.2016
12:18:13
плюс в карму этому господину

Zart
07.07.2016
12:18:20
но всё это чисто детали реализации, потому что питон не обязан агрессивно искать существующие объекты
в случае со строками всё намного сложнее

Google

Марк
07.07.2016
12:18:41

Sergey
07.07.2016
12:18:56
кстати, для строк все немного иначе. вряд ли python преаллокейтит 'z'*10
In [52]: a='z'*10
In [53]: b='z'*10
In [54]: a is b
Out[54]: True
In [55]: b='z'*100
In [56]: a='z'*100
In [57]: a is b
Out[57]: False

Zart
07.07.2016
12:18:58
потому что цпитон для работы с ними использует ряд обёрток, которые активно интернят строки
http://guilload.com/python-string-interning/
интернирование строк снижает расходы на память, ускоряет сравнения и прочие ништяки
но заниматься этим явно бессмысленно в 120% случаев
это кстати еще одна из причин по которой очень сложно считать сколько реально уходит памяти на структуры данных в питоне
потому что для иммутабельных объектов может применяться интернирование. а может и не применяться.

Марк
07.07.2016
12:24:40
А в других языках проще? Пехепе каком-нибудь/руби/перл?

Zart
07.07.2016
12:25:02
не вникал

Sergey
07.07.2016
12:25:09

Zart
07.07.2016
12:25:12
такие тонкости нужны очень редко

Sergey
07.07.2016
12:25:53
забавно, что интернируются только альфанумерики
интересно почитать комменты разработчиков, почему именно так

Zart
07.07.2016
12:26:14
спецификация языка тебе гарантирует только то, что всё в питоне - объект, работает по референсам и скорее всего использует рефкаунтинг
причем насколько помню gc модуль объявлен был деталью реализации, и рефкаунтинг в языке не обязателен

Марк
07.07.2016
12:27:24
Вообще, я рад, что сегодня поднялся вопрос с этими интами. До него мы как-то пиздели про id c инт - и я чет пришел к выводу по итогу, что если int, то id его изменить невозможно. Даже через дипкопи, ну или поебавшись, как Зарт предлагал. А теперь получается, что мое представление было вкорне неверным

Zart
07.07.2016
12:27:27

Темный
07.07.2016
12:28:03
где почитать гайды что бы стать таким же умным как Зарт?

Марк
07.07.2016
12:28:26
Нигде)

Google

Zart
07.07.2016
12:28:42
читай доки и исходники, и всё будет

Марк
07.07.2016
12:32:56
В доках меня чутка бесит факт, что какой-то ньюанс может быть кратенько описан или вообще по сноске. Если привык читать быстро и по диагоналям, то проебать проще простого

Andrew
07.07.2016
12:33:03
Зарт а ты в плюсах силен?)

Zart
07.07.2016
12:33:18
не очень
слишком давно писал, но читать исходники все равно приходится регулярно
те же исходники wxWdigets, например, чтобы понять каким хреном глканвас инициализирует wgl
>>> import sys, pprint ; sys.displayhook = pprint.pprint
>>> import dis
>>> codeobj = compile('a, b = 500, 500', '<code>', 'exec')
>>> {k: getattr(codeobj, k) for k in dir(codeobj) if k[:3] == 'co_'}
{'co_argcount': 0,
'co_cellvars': (),
'co_code': 'd\x02\x00\\\x02\x00Z\x00\x00Z\x01\x00d\x01\x00S',
'co_consts': (500, None, (500, 500)),
'co_filename': '<code>',
'co_firstlineno': 1,
'co_flags': 64,
'co_freevars': (),
'co_lnotab': '',
'co_name': '<module>',
'co_names': ('a', 'b'),
'co_nlocals': 0,
'co_stacksize': 2,
'co_varnames': ()}
>>> dis.dis(codeobj)
1 0 LOAD_CONST 2 ((500, 500))
3 UNPACK_SEQUENCE 2
6 STORE_NAME 0 (a)
9 STORE_NAME 1 (b)
12 LOAD_CONST 1 (None)
15 RETURN_VALUE
None


Марк
07.07.2016
12:45:30
А что значит ; ?
In [390]: import sys, os ; os
<module 'os' from '/usr/lib/python2.7/os.pyc'>
И это не ошибка

Zart
07.07.2016
12:46:15
разделитель команд, как в том же С
просто в питоне редко им пользуются, так как читабельность хромает

Zart
07.07.2016
12:47:26
ну и плюс циклы и условия нельзя нормально писать через него, так как отступов нет

Sergey
07.07.2016
12:47:32
Да и в других языках не сильно однострочники любят, если только это не perl

Марк
07.07.2016
12:48:00
In [391]: print "ok" ; print "yes"
ok
yes
Зарт, ты иногда учишь плохим вещам
Блядь, это охуенно

Zart
07.07.2016
12:48:36
ну if/while/for ты туда не сунешь

Марк
07.07.2016
12:52:36
return 1; return 2; return 3
Прикольно.

Google

Sergey
07.07.2016
12:52:55

Zart
07.07.2016
12:52:57
первый ретурн отработает, до второго не дойдет

Марк
07.07.2016
12:53:04
Ага

Темный
07.07.2016
12:53:36
на правительство?

Марк
07.07.2016
12:53:58
Только зачем?
Понимаешь, это называется любопытством или жаждой познания. Мы, вообще-то в космос летаем благодаря этому

Zart
07.07.2016
12:54:12
ну газпром вроде государственная, но его дочки таки частные

JPyFoxy
07.07.2016
12:55:11
Решал задание типа нахождение уникальных элементов в массиве.
from random import *
m = []
mas = [randrange(0, 10) for i in range(10)]
mas.sort()
print("input :", mas)
for i in mas:
if(mas.count(i) == 1):
m.append(i)
print("output:", m)

Sergey
07.07.2016
12:55:19

Admin
ERROR: S client not available

Zart
07.07.2016
12:56:06

Марк
07.07.2016
12:56:23

Sergey
07.07.2016
12:56:53

Zart
07.07.2016
12:56:59

JPyFoxy
07.07.2016
12:57:00
?это задание можно решить проще

mey
07.07.2016
12:59:06
Можно разу выводить
Зачем два массива

Zart
07.07.2016
12:59:18
>>> mas = [randrange(0, 10) for i in range(10)]
>>> mas
[0, 5, 0, 6, 2, 1, 7, 3, 1, 0]
>>> [k for k, v in collections.Counter(mas).items() if v == 1]
[2, 3, 5, 6, 7]
>>>

mey
07.07.2016
12:59:21

Google

Zart
07.07.2016
12:59:41
либо загонять элементы в два сета

Andrey
07.07.2016
13:00:44

Zart
07.07.2016
13:01:46
seen, seen_once = set(), set()
для каждого нового x:
if x in seen and x in seen_once:
del seen_once[x]
seen.add(x)
в seen_once сете будет список элементов, которые встречались лишь раз на данный момент

Марк
07.07.2016
13:01:52

mey
07.07.2016
13:02:20

Zart
07.07.2016
13:02:24
марк, перечитай https://docs.python.org/2/reference/
можно по диагонали за полчаса

Andrey
07.07.2016
13:02:47

mey
07.07.2016
13:03:00

Zart
07.07.2016
13:03:16
просто хотя бы для того чтобы знать список ключевых слов и общую работу каждого

Andrey
07.07.2016
13:03:29
Да
был и есть. Но это дело каждого как себя вести, в общем-то

Марк
07.07.2016
13:05:26
( ) [ ] { } @
, : . ` = ;
+= -= *= /= //= %=
&= |= ^= >>= <<= **=

Zart
07.07.2016
13:06:50
` выпилен в тройке
`something` это очень старая запись, с первых питонов
эквивалентна repr(something)

Марк
07.07.2016
13:08:05
Кстати, вот поэтому мне и не нравится дока по пайтону: список есть, а дальше пиздуй искать самостоятельно

Zart
07.07.2016
13:08:13
больше вроде бактик нигде в питоне не применяется

Roman
07.07.2016
13:08:31
если ты читаешь всегда быстро и подиагонали, то тебе не видать большой и чистой любви
лишь случайные связи

Zart
07.07.2016
13:08:37
нууу.. я изучил 2.5, а потом читал what's new in X.Y

Марк
07.07.2016
13:09:09

Zart
07.07.2016
13:09:24
всё разжевано по порядку

Марк
07.07.2016
13:09:46
https://docs.python.org/2/reference/lexical_analysis.html#delimiters
Эта группа больше не существует