LINUX.ORG.RU
ФорумTalks

О прожорливости питона


0

4

Довольно часто приходится читать про его аппетит и что только Java уделывает и etc. Хотелось бы услышать реальные причины прожоривости питона, в котором его обвиняют. Хотя наверняка сейчас сюда набежит голодная публика

★★★★★

Он под каждый integer выделяет сишную структуру со всякой дополнительной информацией типа счетчиков ссылок. Я пробовал выделять список на 100000000 элементов, так питон в OOM вылетал (при 4г виртуальной памяти), хотя в C это съедало всего 400 мб.

elverion
()
Ответ на: комментарий от elverion

Допустим, а perl например что же делает все по пуритански, просто про него таких выкриков не слышал.

pylin ★★★★★
() автор топика

и на перле можно плодить перекрёстные ссылки и он тоже будет жрать память или делать какую-нибудь ерунду, а потом удивляться, что он тормозит.

с кривыми руками всё прожорливое.

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

>с кривыми руками

Это не баг это фича! (с)

Если ее не брать в расчет, то основная причина это просто тролололо илли как? Про integers верное замечание, однако наверно эта проблема многих языков, где цифра с наворотами реализована

pylin ★★★★★
() автор топика
Ответ на: комментарий от elverion

> Я пробовал выделять список на 100000000 элементов, так питон в OOM вылетал (при 4г виртуальной памяти), хотя в C это съедало всего 400 мб.

«Кажется, одна из черепашек пи^Wлжет» (с)

$ python
Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type «help», «copyright», «credits» or «license» for more information.

a = [1]*100000000

b = sum(a)


print b


100000000




32434 0.3 12.7 397512 393628 pts/29 S+ 01:12 0:00 python

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
megabaks 16874 4.5 9.5 399864 394500 pts/1 S<+ 01:20 0:01 /usr/bin/python2.7

таки да

megabaks ★★★★
()
Ответ на: комментарий от megabaks

и это говорит мегабакс и в самом деле что то в мире не то )

а код весь:запустить IDLE и набрать цифру и поставить точку->???->ПРОФИТ!!!

pylin ★★★★★
() автор топика
Ответ на: комментарий от elverion

список на 100000000 элементов

Я так понял в этом треде критикуют голый интерпретатор при решении задач, для которых он не предназначен, а не модули для интерпретатора, затачивающих его для тех самых задач?

ados ★★★★★
()
Ответ на: комментарий от elverion

> Странно, а такой код жрет память

А, ну понятно... его аналогом на Си будет вот это:

for (i = 0; i < 100000000; i++)
malloc(sizeof(int));

tailgunner ★★★★★
()
Ответ на: комментарий от elverion

да оно и предыдущее около 2-х гигов съело и выдало выхлоп

megabaks ★★★★
()
Ответ на: комментарий от elverion

Да тогда ты ее и попробовал )

pylin ★★★★★
() автор топика
Ответ на: комментарий от elverion

Вместо питоновского решения, что представлено выше, ты выбрал пехепешное решение и удивляешься что оно жрет память?

Siado ★★★★★
()
Ответ на: комментарий от elverion

Нет. Аналогом на C будет malloc(sizeof(int) * 100000000).

для такого кода:

l = []
for i in range(100000000):
    l.append(i)
print(sum(l))

это явно не аналог, разве что использовать realloc

aho
()
Ответ на: комментарий от Siado

Почему оно PHPшное? В реальных программах вполне может понадобиться постепенно добавлять элементы в список.

Вот тебе питоновские решение:

[code=python]range(100000000)[/code]

Запускать на 2 питоне.

elverion
()
Ответ на: комментарий от aho

Аналогичный c++-ный код выше уже был. В C можно извратится с realloc'ом.

elverion
()
Ответ на: комментарий от elverion

На 2 питоне будут применять xrange при таких размерах списка

pylin ★★★★★
() автор топика
Ответ на: комментарий от aho

>> Неужели? Расскажи подробнее.

про что?

Почему «явно не аналог».

про realloc? или про то как его используют?

Нет, про это не надо. Я верю, что ты уже нагуглил пример кода с realloc.

tailgunner ★★★★★
()
Ответ на: комментарий от elverion

Если нужен массив интов, то можно numpy.array(dtype=int). Ибо списки - они для другого нужны

michwill ★★★★★
()
Ответ на: комментарий от tailgunner

Хорошо, вот что получится, немного изменить твой код.

a = [1]*100000000
for i in xrange(100000000):
    a[i] = i

Питон опять лезет в своп и тормозит не хуже чем при 12309. Очевидно для sum выполняется какая-то оптимизация.

elverion
()
Ответ на: комментарий от michwill

> Хитрец!

Список на 100000000 элементов есть? Да. Получите и распишитесь.

А если кто-то хочет создавать объекты по одному - нет проблем, но тогда делайте так и в Си.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Почему «явно не аналог».

потому-что выполняются разные операции с памятью, как на «бумаге» так и при работе кода

Я верю, что ты уже нагуглил пример кода с realloc.


ну и зря

aho
()

Java уделывает

Вообще-то python и java - языки и при исполнении питон-скриптов аппетит на оперативку имеет интерпретатор. Не знаю как у жабы ( знаю, что есть несвободная платформа и свободная), а у питона их несколько.

ados ★★★★★
()
Ответ на: комментарий от elverion

> Хорошо, вот что получится, немного изменить твой код.

Естественно. Здесь ты создаешь 100000000 отдельных объектов.

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

tailgunner ★★★★★
()
Ответ на: комментарий от elverion

Если хочется все инты хранить в памяти, можно сделать так:

In [1]: import numpy
In [2]: a = numpy.arange(0, 1000000, dtype=int)
In [3]: b = a**2

Как можно видеть, не только память в порядке, но и арифметические операции выполняются очень быстро. А кто скажет, что numpy - это не чистый питон - используйте Linux без GNU

michwill ★★★★★
()
Ответ на: комментарий от michwill

А для ссылок есть аналог array или numpy? Я думаю что в таких программах как portage или mercurial может потребоваться хранить очень много ссылок на объекты. Отрицать тормознутость emerge я думаю никто не будет.

elverion
()
Ответ на: комментарий от Tark

Нужно присвоить значения элементам массива. Делать это можно как угодно.

elverion
()
Ответ на: комментарий от pylin

Стандартная jvm хранит массивы фиксированной длины в виде куска памяти нужного формата, оверхеда на каждый элемент нет.
Для питона наверняка есть аналоги, вот хотя бы в numpy

note173 ★★★★★
()
Ответ на: комментарий от note173

Что сказать-то хотел: в любом языке или платформе есть узкие места, надо просто не решать в таком случае в лоб

note173 ★★★★★
()
Ответ на: комментарий от elverion

> А для ссылок есть аналог array или numpy?

Для ссылок обычный список съедает практически ровно столько памяти, сколько едят указатели. Пример Вам уже показали: 100000000 указателей на объект 1: [1]*100000000 (посмотрите top).

Если же хочется непременно список со ссылками (list) и уж точно чистых интов, то и тут всё возможно:
In [6]: a = []

In [7]: for i in range(1000000):
...: a.append(ctypes.c_int64(i))

michwill ★★★★★
()
Ответ на: комментарий от elverion

И в каких задачах на питоне такое нужно?

Quasar ★★★★★
()
Ответ на: комментарий от elverion

Ничего странного. Быдлокод всегда прожорливый.

Quasar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.