utros 13.07.2011 14:04

Запилил говнокод http://pastebin.com/PH2sV8Zu и скормил его питону 2.6.6 и PyPy с jit'ом вчерашней сборки.
Питон отработал за 3,5 минуты, а PyPy работал пол часа и так и не закончил :(
ЧЯДНТ?!

Recommended by: @238328
1. werehuman 13.07.2011 14:06 Psi+

у pypy грусно с сишными модулями. Попробуй без регексп тест

2. kb 13.07.2011 14:30 40c636ec

спросил на #pypy. Говорят

antocuni 17:27:14
k_bx: the culprit seems to be s += ...
I think that cpython has a special case for this and optimizes it 17:27:41

k_bx 17:28:04
yeah, it's +=

antocuni 17:28:19
IIRC, pypy has code to speed up string concatenation in general, but it's disabled by default
I don't remember why 17:28:22

exarkun 17:28:54
that string optimization is so obnoxious :(

antocuni 17:28:57
arigato: do you remember why strjoin is disabled by default?

3. werehuman → kb /2 13.07.2011 14:30 Psi+

отлично, прямо как в jython. Юзаем format

4. kb → werehuman /3 13.07.2011 14:32 40c636ec

а что в jython? Что за format?

5. werehuman → kb /4 13.07.2011 14:32 Psi+

там тоже конкатенация строк через операторы работает медленно и они рекомендуют юзать str.join и str.format для складывания строк

6. werehuman → werehuman /5 13.07.2011 14:32 Psi+

пруфов не найду

7. kb → werehuman /5 13.07.2011 14:33 40c636ec

о, спасибо.

8. kb → werehuman /5 13.07.2011 14:34 40c636ec

да уж. s = str.join(s, s[ri])

10. kb → werehuman /5 13.07.2011 14:40 40c636ec

кто-то даже более правильную версию скрипта написал) http://codepad.org/R8arse0p

11. utros → werehuman /1 13.07.2011 14:45 Adium

Я знаю. Там re вроде свой, не?

12. kb → utros /11 13.07.2011 14:45 40c636ec

да, не должен быть там re через сишный модуль. Все с re в порядке вроде.

13. utros → kb /2 13.07.2011 14:48 Adium

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

14. utros → werehuman /5 13.07.2011 14:48 Adium

В CPython'е конкатенация тоже медленнее join для нескольких строк

15. kb → utros /13 13.07.2011 14:49 40c636ec

учитывая то, что он не имеет смысла — да, еще как можно))

16. werehuman → utros /14 13.07.2011 14:49 Psi+

там дан годный совет — юзать StringBuffer

17. kb → werehuman /16 13.07.2011 14:50 40c636ec

это ж для java, не?

19. utros → kb /15 13.07.2011 14:51 Adium

Смысл был потестить работу с большими строками и, главное, регэкспами

20. utros → werehuman /16 13.07.2011 14:51 Adium

Привет, сишарп!

21. werehuman → utros /20 13.07.2011 14:51 Psi+

будто что-то плохое

22. utros → werehuman /21 13.07.2011 14:52 Adium

Сишарп вообще хороший, пока блевать не начинаешь с него :)

23. kb → utros /19 13.07.2011 14:52 40c636ec

ну вот регекспы и тестируй, без += :-D

24. utros → kb /23 13.07.2011 14:53 Adium

Там смысл был в тестировании на строках разной длины :)

25. kb → utros /24 13.07.2011 14:53 40c636ec

ну можно сначала строк нагенерировать, а потом тестировать по ним, что ли

26. utros → kb /23 13.07.2011 14:54 Adium

На самом деле, надо будет зопейлить хороший тест: pypy ведь нормально переваривает питоновый кот не считая черезжопного подключения сишных модулей?

27. werehuman → utros /26 13.07.2011 14:54 Psi+

иногда сегфолтится

28. utros → werehuman /27 13.07.2011 14:55 Adium

Это не особая проблема :)

29. utros → kb /25 13.07.2011 15:07 Adium

Ну мне не важно что делать, важно было понять из-за чего ТАК медленно работало

30. werehuman → utros /29 13.07.2011 15:08 Psi+

и ты понял

Do you really want to delete ?