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. werehumankb /2 13.07.2011 14:30 Psi+

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

4. kbwerehuman /3 13.07.2011 14:32 40c636ec

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

5. werehumankb /4 13.07.2011 14:32 Psi+

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

6. werehumanwerehuman /5 13.07.2011 14:32 Psi+

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

7. kbwerehuman /5 13.07.2011 14:33 40c636ec

о, спасибо.

8. kbwerehuman /5 13.07.2011 14:34 40c636ec

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

10. kbwerehuman /5 13.07.2011 14:40 40c636ec

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

11. utroswerehuman /1 13.07.2011 14:45 Adium

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

12. kbutros /11 13.07.2011 14:45 40c636ec

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

13. utroskb /2 13.07.2011 14:48 Adium

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

14. utroswerehuman /5 13.07.2011 14:48 Adium

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

15. kbutros /13 13.07.2011 14:49 40c636ec

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

16. werehumanutros /14 13.07.2011 14:49 Psi+

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

17. kbwerehuman /16 13.07.2011 14:50 40c636ec

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

19. utroskb /15 13.07.2011 14:51 Adium

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

20. utroswerehuman /16 13.07.2011 14:51 Adium

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

21. werehumanutros /20 13.07.2011 14:51 Psi+

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

22. utroswerehuman /21 13.07.2011 14:52 Adium

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

23. kbutros /19 13.07.2011 14:52 40c636ec

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

24. utroskb /23 13.07.2011 14:53 Adium

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

25. kbutros /24 13.07.2011 14:53 40c636ec

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

26. utroskb /23 13.07.2011 14:54 Adium

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

27. werehumanutros /26 13.07.2011 14:54 Psi+

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

28. utroswerehuman /27 13.07.2011 14:55 Adium

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

29. utroskb /25 13.07.2011 15:07 Adium

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

30. werehumanutros /29 13.07.2011 15:08 Psi+

и ты понял

Do you really want to delete ?