Maneiras eficientes de duplicar matriz / lista em Python

Nota: Eu sou um desenvolvedor Ruby tentando encontrar meu caminho em Python.

Quando eu quis descobrir porque alguns scripts usammylist[:] ao invés delist(mylist) para duplicar listas, fiz uma referência rápida dos vários métodos para duplicarrange(10) (veja o código abaixo).

EDITAR: Eu atualizei os testes para fazer uso do Pythontimeit como sugerido abaixo. Isso torna impossível compará-lo diretamente ao Ruby, porquehorário não conta para o loop enquanto RubyBenchmark faz, então o código Ruby é paraApenas referência.

Python 2.7.2

Array duplicating. Tests run 50000000 times
list(a)     18.7599430084
copy(a)     59.1787488461
a[:]         9.58828091621
a[0:len(a)] 14.9832749367

Para referência, eu escrevi o mesmo script em Ruby também:

Ruby 1.9.2p0

Array duplicating. Tests 50000000 times
                      user     system      total        real
Array.new(a)     14.590000   0.030000  14.620000 ( 14.693033)
Array[*a]        18.840000   0.060000  18.900000 ( 19.156352)
a.take(a.size)    8.780000   0.020000   8.800000 (  8.805700)
a.clone          16.310000   0.040000  16.350000 ( 16.384711)
a[0,a.size]       8.950000   0.020000   8.970000 (  8.990514)

Questão 1: o que émylist[:] fazendo diferente que é25% mais rápido do que atémylist[0:len(mylist)]. Copia na memória diretamente ou o quê?

Questão 2: editar: benchmarks atualizados não mostram grandes diferenças em Python e Ruby.estava: Eu implementei os testes de alguma forma obviamente ineficiente, para que o código Ruby seja muito mais rápido que o Python?

Agora as listagens de código:

Python:

import timeit

COUNT = 50000000

print "Array duplicating. Tests run", COUNT, "times"

setup = 'a = range(10); import copy'

print "list(a)\t\t", timeit.timeit(stmt='list(a)', setup=setup, number=COUNT)
print "copy(a)\t\t", timeit.timeit(stmt='copy.copy(a)', setup=setup, number=COUNT)
print "a[:]\t\t", timeit.timeit(stmt='a[:]', setup=setup, number=COUNT)
print "a[0:len(a)]\t", timeit.timeit(stmt='a[0:len(a)]', setup=setup, number=COUNT)

Rubi:

require 'benchmark'

a = (0...10).to_a

COUNT = 50_000_000

puts "Array duplicating. Tests #{COUNT} times"

Benchmark.bm(16) do |x|
  x.report("Array.new(a)")   {COUNT.times{ Array.new(a) }}
  x.report("Array[*a]")   {COUNT.times{ Array[*a] }}
  x.report("a.take(a.size)")   {COUNT.times{ a.take(a.size) }}
  x.report("a.clone")    {COUNT.times{ a.clone }}
  x.report("a[0,a.size]"){COUNT.times{ a[0,a.size] }}
end

questionAnswers(2)

yourAnswerToTheQuestion