Qual é a "única maneira [...] óbvia" de adicionar todos os itens de um iterável a um existente set
?
python
set
conventions
iterable
Ian Mackinnon
fonte
fonte
set
construtor assume uma iterável como argumento.{1, 2, 3}
em Python 3 enquanto eraset([1, 2, 3])
em Python 2.Para o benefício de qualquer um que possa acreditar, por exemplo, que fazer
aset.add()
em loop teria desempenho competitivo em relação a fazeraset.update()
, aqui está um exemplo de como você pode testar suas crenças rapidamente antes de se tornar público:Parece que o custo por item da abordagem de loop é mais de TRÊS vezes o da
update
abordagem.Usar
|= set()
custos cerca de 1,5x o queupdate
faz, mas metade do que adiciona cada item individual em um loop.fonte
Você pode usar a função set () para converter um iterável em um conjunto e, em seguida, usar o operador de atualização de conjunto padrão (| =) para adicionar os valores exclusivos do seu novo conjunto ao existente.
fonte
.update
tem o benefício de que o argumento pode ser iterável - não necessariamente um conjunto - ao contrário do RHS do|=
operador em seu exemplo.|
união,&
interseção e^
obtenção de elementos que estão em um ou no outro, mas não em ambos. Mas em uma linguagem de tipo dinâmico, onde às vezes é difícil ler o código e conhecer os tipos de objetos voando, sinto-me hesitante em usar esses operadores. Alguém que não os reconhece (ou talvez nem perceba que o Python permite operadores como esses) pode ficar confuso e pensar que algumas operações lógicas ou bit a bit estão acontecendo. Seria bom se esses operadores também trabalhassem em outros.update()
e adicione elementos individuais em um loop. Achei que.update()
era mais rápido. Adicionei meus resultados a esta resposta existente: stackoverflow.com/a/4046249/901641Apenas uma atualização rápida, horários usando python 3:
Os resultados são:
fonte
Use a compreensão da lista.
Curto-circuito na criação de iterável usando uma lista, por exemplo :)
[Editar: perdeu a parte definida da pergunta]
fonte
Para o registro, acho que a afirmação de que "deveria haver uma - e de preferência apenas uma - maneira óbvia de fazê-lo". é falso. Supõe-se que muitas pessoas de espírito técnico fazem, que todo mundo pensa da mesma forma. O que é óbvio para uma pessoa não é tão óbvio para outra.
Eu diria que minha solução proposta é claramente legível e faz o que você pede. Não acredito que haja algum impacto no desempenho envolvido - embora admita que possa estar faltando alguma coisa. Mas, apesar de tudo isso, pode não ser óbvio e preferível a outro desenvolvedor.
fonte
aset.update(iterable)
loop na velocidade C e ofor item in iterable: aset.add(item)
loop na velocidade do Python, com uma pesquisa de método e uma chamada de método (aarrgghh !!) por item.