Azbuka 278 #185306 Posted May 19, 2014 что написанный код можно написать компактнее и проще Конечно можно! Переходите на Ruby и будет вам компактный и простой код! Для примера, простая операция сравнения чисел: Python: def my(one,two): if two < one: print "Two < One" elif one < two: print "One < Two" elif one == two: print "One = Two" my(1,2) А вот в Ruby: def my(one,two) if two < one print "Two < One\n" elsif one < two print "One < Two\n" elsif one == two print "One = Two\n" end end my(1,2) Или так: def my(one,two) if two < one print "Two < One\n" elsif one < two print "One < Two\n" elsif one == two print "One = Two\n" end end my(1,2) Можно даже так (Осторожно! Плохой стиль кодинга! Никогда так не делайте!): def my(one,two) if two < one print "Two < One\n" elsif one < two print "One < Two\n" elsif one == two print "One = Two\n" end end my(1,2) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185309 Posted May 19, 2014 Кто-нибудь увидел разницу? 2 Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #185311 Posted May 19, 2014 (edited) Кто-нибудь увидел разницу? Тут конечно же её нет. Надо что-нибуть с классами придумать... А вот впрочем и оно - загрузчик модов для wot: Python: import BigWorld class CameraNode(BigWorld.UserDataObject): def __init__(self): BigWorld.UserDataObject.__init__(self) def load_mods(): import ResMgr, os, glob sec = ResMgr.openSection('../paths.xml') subsec = sec['Paths'] vals = subsec.values()[0:2] for val in vals: mp = val.asString + '/scripts/client/mods/*.pyc' for fp in glob.iglob(mp): _, fn = os.path.split(fp) sn, _ = fn.split('.') if sn != '__init__': print 'LoadMod: ' + sn try: exec 'import mods.' + sn except Exception as e: print e load_mods() Ruby в процессе... Edited May 19, 2014 by Azbuka_slovensko Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185314 Posted May 19, 2014 (edited) загрузчик модов для wot import BigWorld class CameraNode(BigWorld.UserDataObject): def __init__(self): BigWorld.UserDataObject.__init__(self) def load_mods(): for val in __import__('ResMgr').openSection('../paths.xml')['Paths'].values()[0:2]: for fp in __import__('glob').iglob(val.asString + '/scripts/client/mods/*.pyc'): sn = __import__('os').path.split(fp)[1].split('.')[0] if sn != '__init__': print 'LoadMod: ' + sn try: exec 'import mods.' + sn except Exception as e: print e load_mods() Edited May 19, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Azbuka 278 #185316 Posted May 19, 2014 (edited) @StranikS_Scan, Это разве не одно и то же? import ResMgr, os, glob sec = ResMgr.openSection('../paths.xml') subsec = sec['Paths'] vals = subsec.values()[0:2] for val in vals: И: for val in __import__('ResMgr').openSection('../paths.xml')['Paths'].values()[0:2]: mp = val.asString + '/scripts/client/mods/*.pyc' for fp in glob.iglob(mp): И: for fp in __import__('glob').iglob(val.asString + '/scripts/client/mods/*.pyc'): Edited May 19, 2014 by Azbuka_slovensko Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185322 Posted May 19, 2014 , результат да. Но это так я только портянку сократил, мона реально компактно переписать. Quote Share this post Link to post Short link Share on other sites
lportii 14 #185324 Posted May 19, 2014 Код может быть короткий, компактный, а может быть быстрый. def load_mods(): import ResMgr, os, importlib res = ResMgr.openSection('../paths.xml') sb = res['Paths'] vals = sb.values()[0:2] for vl in vals: module_files = vl.asString + '/scripts/client/mods' for root, dirs, files in os.walk(module_files): for file in files: fullpath = os.path.join(root, file).replace('\\', '/') if os.path.splitext(fullpath)[1] == '.pyc': imported_module = fullpath.split('scripts/client/')[1].split('.pyc')[0].replace('/', '.') print 'LoadMod: ' + imported_module try: module = importlib.import_module(imported_module) except Exception as e: print 'Error LoadMod: ' + str(imported_module) + ' : ' + e Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185327 Posted May 19, 2014 (edited) @lportii, а частичный импорт не быстрее будет? from importlib import import_module Питон при импорте грузит весь модуль, а вот как при частичном поступает я не помню. И я бы не стал юзать replace если нужна быстрота :)))) Edited May 19, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
lportii 14 #185330 Posted May 19, 2014 (edited) Заметил еще давно, подружая пакет из модулей, в логе модули объявляются не по алфавиту, a через exec по списку, ровно. п.с. не мерил скорость, но думаю из нескольких потоков подгружаться будет быстрее. Edited May 19, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185344 Posted May 19, 2014 (edited) п.с. не мерил скорость, но думаю из нескольких потоков подгружаться будет быстрее. Не, там нет многопоточности, на программном уровне одновременно два потока параллельно не выполняются, всегда работает только какой-то один, а вот обвязка каждого потока и переключение между ними - думаю только ухудшат быстродействие. И еще вот вопрос зачем менять "\\" на "/" это одно и то же. Edited May 19, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
lportii 14 #185431 Posted May 19, 2014 Не, там нет многопоточности, на программном уровне одновременно два потока параллельно не выполняются, всегда работает только какой-то один, а вот обвязка каждого потока и переключение между ними - думаю только ухудшат быстродействие. Т.е. потоки вообще не дают прироста или конкретно в случае импорта? И еще вот вопрос зачем менять "\\" на "/" это одно и то же. Был когда то конфликт с адресом, врезалось в память. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185439 Posted May 19, 2014 (edited) Т.е. потоки вообще не дают прироста или конкретно в случае импорта? Был когда то конфликт с адресом, врезалось в память. Ага, там стоит "контроллер" доступа к памяти и он запрещает одновременно иметь доступ к памяти двум и более потокам/процессам, в результате когда один работает, то все остальные принудительно усыпляются им. Как результат экономии времени не происходит. Вот такой питон. Я когда узнал про это очень приуныл, т.к. я люблю потоки. Ну все часто используемые нами функции этим не страдают. Edited May 19, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
lportii 14 #185500 Posted May 19, 2014 StranikS_Scan, что может значить, с недавнего времени (возможно последняя обнова) ошибки в модах показывает стабильно на 4 строки ниже. Может быть инжект в код? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #185587 Posted May 20, 2014 StranikS_Scan, что может значить, с недавнего времени (возможно последняя обнова) ошибки в модах показывает стабильно на 4 строки ниже. Может быть инжект в код? Пример приведи Quote Share this post Link to post Short link Share on other sites
fecell 125 #185710 Posted May 21, 2014 Т.е. потоки вообще не дают прироста или конкретно в случае импорта? http://habrahabr.ru/post/84629/ Конечно можно! Переходите на Ruby и будет вам компактный и простой код! Это к разработчикам танков, плз.. в танках ведь питон, а не фортран, лисп или рубин. Quote Share this post Link to post Short link Share on other sites
lportii 14 #186415 Posted May 23, 2014 Пример приведи Не.., нормально все, просто после упаковочки немного "жирнеет" скрипт. http://habrahabr.ru/post/84629/ Ерунда какая то, зачем вообще модуль threading делали. Скорости очень часто не хватает. 1 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #186425 Posted May 23, 2014 @lportii, ну не могут они найти простое и оригинальное решение для управления доступом к памяти параллельных потоков. Вот потому и нет щАстья в ихнем мире :))))))))) Quote Share this post Link to post Short link Share on other sites
Mr A 750 #188955 Posted June 5, 2014 @StranikS_Scan, когда обновление? Было бы хорошо помечать более заметно то, что скрипт не скомпилирован (путь пишет в любом случае) и выделять строчку с ошибкой в редакторе. Quote Share this post Link to post Short link Share on other sites
lojtar 1 #188966 Posted June 5, 2014 Доброго времени суток. Стараюсь делать строго всё по видео, но смущают лишнии строчки в компиляторе. Вот ваш скрин: А вот мой: Так должно быть или уже закралась ошибка? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,203 #188999 Posted June 6, 2014 (edited) @StranikS_Scan, когда обновление? Было бы хорошо помечать более заметно то, что скрипт не скомпилирован (путь пишет в любом случае) и выделять строчку с ошибкой в редакторе. Снимок.PNG На следующей неделе наверно, я трансмиттер написал чтоб обмениваться данными с клиентом игры, но так и не оттестил, в мае времени не было. Выделение строк проблемно, я юзаю синтаксический шаблон, подсветка автоматизирована. Могу слова типа "invalid syntax" занести в шаблон и отображать красным цветом. Я так уже сделал с некоторыми словосочетаниями. По поводу "пишет путь", там надо логику будет подправить. Вообще возврат ошибок - геморное место, т.к. я локализую их в самом питоне. Так должно быть или уже закралась ошибка? Ошибок нет, это функция была отключена, когда снималось видео. Да и еще, кто-то писал на форуме что не смог запустить декомпиляцию объекта из памяти в pyREtic. Я pyREtic полностью подключил через его головной файл теперь он не выдает ошибки при декомпиляции, а то крашился постоянно. И сделал функцию декомпиляцию объекта из памяти. Она декомпилирует импортированные модули, инициализированные классы, но вот отдельно функции почему то не декомпилит, почему - хз :))))) Edited June 6, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites