É uma lista vinculada, uma matriz? Eu procurei e só encontrei pessoas adivinhando. Meu conhecimento em C não é bom o suficiente para examinar o código fonte.
182
É uma lista vinculada, uma matriz? Eu procurei e só encontrei pessoas adivinhando. Meu conhecimento em C não é bom o suficiente para examinar o código fonte.
É uma matriz dinâmica . Prova prática: a indexação leva (obviamente com diferenças extremamente pequenas (0,0013 µseg!)) Ao mesmo tempo, independentemente do índice:
...>python -m timeit --setup="x = [None]*1000" "x[500]"
10000000 loops, best of 3: 0.0579 usec per loop
...>python -m timeit --setup="x = [None]*1000" "x[0]"
10000000 loops, best of 3: 0.0566 usec per loop
Eu ficaria surpreso se o IronPython ou o Jython usassem listas vinculadas - elas arruinariam o desempenho de muitas bibliotecas amplamente usadas, construídas com a suposição de que as listas são matrizes dinâmicas.
x=[None]*1000
, deixando a medição de qualquer possível diferença de acesso à lista bastante imprecisa. Você precisa separar a inicialização:-s "x=[None]*100" "x[0]"
O código C é bem simples, na verdade. Expandindo uma macro e removendo alguns comentários irrelevantes, está a estrutura básica
listobject.h
, que define uma lista como:PyObject_HEAD
contém uma contagem de referência e um identificador de tipo. Portanto, é um vetor / array que atribui uma classificação geral. O código para redimensionar um array tal quando está cheia está emlistobject.c
. Na verdade, ele não duplica a matriz, mas cresce alocandode acordo com a capacidade de cada vez, onde
newsize
está o tamanho solicitado (não necessariamenteallocated + 1
porque você pode,extend
por um número arbitrário de elementos, em vez deappend
selecioná-los um por um).Veja também as Perguntas frequentes sobre Python .
fonte
array
módulo ou o NumPy são os preferidos.No CPython, listas são matrizes de ponteiros. Outras implementações do Python podem optar por armazená-las de maneiras diferentes.
fonte
Isso depende da implementação, mas o IIRC:
ArrayList
Assim, todos eles têm acesso aleatório O (1).
fonte
O(1)
a indexação de lista é uma suposição bastante comum e válida, nenhuma implementação ousaria quebrá-la.Eu sugeriria o artigo de Laurent Luce "Implementação da lista Python" . Foi realmente útil para mim, porque o autor explica como a lista é implementada no CPython e usa excelentes diagramas para esse fim.
...
...
...
...
fonte
aggregation
, nãocomposition
. Eu gostaria que houvesse uma lista de composição também.De acordo com a documentação ,
fonte
Como já mencionado anteriormente, as listas (quando consideravelmente grandes) são implementadas alocando uma quantidade fixa de espaço e, se esse espaço for preenchido, alocando uma quantidade maior de espaço e copiando os elementos.
Para entender por que o método é O (1) amortizado, sem perda de generalidade, assuma que inserimos a = 2 ^ n elementos e agora precisamos dobrar nossa tabela para 2 ^ (n + 1). Isso significa que atualmente estamos realizando 2 ^ (n + 1) operações. Última cópia, fizemos 2 ^ n operações. Antes disso, fizemos 2 ^ (n-1) ... até 8,4,2,1. Agora, se somarmos isso, obtemos 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) total de inserções (ou seja, O (1) tempo amortizado). Além disso, deve-se notar que, se a tabela permitir exclusões, a redução da tabela deverá ser feita em um fator diferente (por exemplo, 3x)
fonte
Uma lista no Python é algo como uma matriz, na qual você pode armazenar vários valores. A lista é mutável, o que significa que você pode alterá-la. O mais importante que você deve saber, quando criamos uma lista, o Python cria automaticamente um reference_id para essa variável de lista. Se você a alterar atribuindo outras variáveis, a lista principal será alterada. Vamos tentar com um exemplo:
Anexamos,
my_list
mas nossa lista principal mudou. A lista desse meio não atribuiu como uma lista de cópias atribuir como referência.fonte
No CPython, a lista é implementada como matriz dinâmica e, portanto, quando acrescentamos naquele momento, não apenas uma macro é adicionada, mas um pouco mais de espaço é alocado, de modo que toda vez que um novo espaço não deve ser adicionado.
fonte