Pergunta

Por exemplo, a quantidade de memória necessária para armazenar uma lista de um milhão (de 32 bits) inteiros?

alist = range(1000000) # or list(range(1000000)) in Python 3.0
Foi útil?

Solução 2

Links úteis:

Como chegar tamanho da memória / uso de objeto python

tamanhos de memória de objetos python?

se você colocar os dados em dicionário, como podemos calcular o tamanho de dados ?

No entanto, eles não dão uma resposta definitiva. O caminho a seguir:

  1. memória Medida consumida pelo interpretador Python com / sem lista (ferramentas de uso do sistema operacional).

  2. Use um módulo de extensão de terceiros que define uma espécie de sizeof (PyObject).

Atualizar :

Receita 546530: Tamanho do Python objetos (revista)

import asizeof

N = 1000000
print asizeof.asizeof(range(N)) / N
# -> 20 (python 2.5, WinXP, 32-bit Linux)
# -> 33 (64-bit Linux)

Outras dicas

"Depende." espaço Python aloca para listas de tal forma a alcançar amortizado constante de tempo para acrescentar elementos para a lista.

Na prática, isso significa com a implementação atual é ... a lista sempre tem espaço alocado para um número potência de dois dos elementos. Então gama (1000000) vai realmente alocar uma lista grande o suficiente para armazenar 2 ^ 20 elementos (~ 1,045 milhões).

Este é apenas o espaço necessário para armazenar a estrutura em si lista (que é uma matriz de ponteiros para o Python objetos para cada elemento). Um sistema de 32 bits exigirá 4 bytes por elemento, um sistema de 64 bits usará 8 bytes por elemento.

Além disso, você precisa de espaço para armazenar os elementos reais. Isso varia amplamente. Para inteiros pequenos (-5 a 256) actualmente, nenhum espaço adicional é necessário, mas para números maiores Python aloca um novo objecto para cada número inteiro, o que leva 10-100 bytes e tende a memória fragmento.

A linha inferior: é complicado e listas Python são não uma boa maneira de armazenar grandes estruturas de dados homogêneas. Para isso, use o módulo array ou, se você precisa fazer matemática vetorizado, use NumPy.

PS- Tuples, ao contrário de listas, são não foi concebido para ter elementos acrescentados progressivamente a eles. Eu não sei como funciona o alocador, mas nem sequer pensar em usá-lo para estruturas de dados grandes: -)

Dirigindo parte "tupla" da questão

Declaração de PyTuple de CPython em uma configuração típica de construção se resume a isto:

struct PyTuple {
  size_t refcount; // tuple's reference count
  typeobject *type; // tuple type object
  size_t n_items; // number of items in tuple
  PyObject *items[1]; // contains space for n_items elements
};

Tamanho da instância PyTuple é fixo durante a sua construção e não pode ser alterado posteriormente. O número de bytes ocupado por PyTuple pode ser calculado como

sizeof(size_t) x 2 + sizeof(void*) x (n_items + 1).

Isto dá rasa tamanho da tupla. Para obter completo tamanho que você também precisa adicionar o número total de bytes consumidos por objeto gráfico enraizada na variedade PyTuple::items[].

É importante notar que as rotinas de construção tupla certificar-se de que somente única instância de tupla vazia é criado sempre (singleton).

Referências: Python.h , object.h , tupleobject.h , tupleobject.c

Uma nova função, getsizeof(), leva um objeto Python e retorna a quantidade de memória usadas pelo objecto, medido em bytes. Built-in objetos de retorno resultados correctos; terceiro extensões não pode, mas pode definir uma método __sizeof__() para retornar o tamanho do objeto.

kveretennicov@nosignal:~/py/r26rc2$ ./python
Python 2.6rc2 (r26rc2:66712, Sep  2 2008, 13:11:55) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
>>> import sys
>>> sys.getsizeof(range(1000000))
4000032
>>> sys.getsizeof(tuple(range(1000000)))
4000024

números Obviamente devolvidos não incluem memória consumida por objetos contidos (sys.getsizeof (1) == 12).

Esta é a implementação específica, eu tenho certeza. Certamente que depende da representação interna de números inteiros - você não pode assumir que vai ser armazenado como 32-bit desde Python dá-lhe arbitrariamente grandes números inteiros então talvez pequenas ints são armazenados de forma mais compacta.

No meu Python (2.5.1 no Fedora 9 no Core 2 Duo) a VmSize antes alocação é 6896kB, depois é 22684kB. Depois de mais de um milhão de atribuição elemento, VmSize vai para 38340kB. Isto indica muito grosseiramente em torno 16000kB para 1000000 inteiros, o que é cerca de 16 bytes por inteiro. Isso sugere um muito de sobrecarga para a lista. Eu levaria estes números com uma grande pitada de sal.

Eu sou cauteloso de por que você está pedindo. Você está tentando descobrir quanta memória você vai precisar para uma determinada aplicação? Diga, você vai ler 10.000.000 de widgets e quer saber quanta memória RAM ele vai sugar?

Se for esse o caso, em vez de tentar descobrir o quanto de RAM cada widget leva, descobrir quanta memória RAM, digamos, 10.000 widgets de leva e multiplicam-se para obter o seu tamanho real.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top