EDIT: Dưới đây là một số con số thực tế! Các izip
, danh sách hiểu, và numpy
cách làm điều này là tất cả về cùng một tốc độ.
# zip
>>> timeit.timeit("newlist = zip(*someList)[0]", setup = "someList = [range(1000000), range(1000000), range(1000000)]", number = 10)
1.4984046398561759
# izip
>>> timeit.timeit("newlist = izip(*someList).next()", setup = "someList = range(1000000), range(1000000), range(1000000)]; from itertools import izip", number = 10)
2.2186223645803693e-05
# list comprehension
>>> timeit.timeit("newlist = [li[0] for li in someList]", setup = "someList = [range(1000000), range(1000000), range(1000000)]", number = 10)
1.4677040212518477e-05
# numpy
>>> timeit.timeit("newlist = someList[0,:]", setup = "import numpy as np; someList = np.array([range(1000000), range(1000000), range(1000000)])", number = 10)
6.6217344397045963e-05
>>>
Đối với các cấu trúc dữ liệu lớn như thế này bạn nên sử dụng numpy
, mà implementes một kiểu mảng trong C và do đó hiệu quả hơn đáng kể. Nó cũng cung cấp tất cả các thao tác ma trận mà bạn mong muốn.
>>> import numpy as np
>>> foo = np.array([[0,1,2],[3,4,5],[6,7,8]])
>>> foo[:,0]
array([0, 3, 6])
Bạn cũng có thể transpose ...
>>> foo.transpose()
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
... làm việc với mảng n chiều ...
>>> foo = np.zeros((3,3,3))
>>> foo
array([[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]])
>>> foo[0,...]
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
..do hiệu quả đại số tuyến tính ...
>>> foo = no.ones((3,3))
>>> np.linalg.qr(foo)
(array([[-0.57735027, 0.81649658, 0. ],
[-0.57735027, -0.40824829, -0.70710678],
[-0.57735027, -0.40824829, 0.70710678]]), array([[ -1.73205081e+00, -1.
73205081e+00, -1.73205081e+00],
[ 0.00000000e+00, -1.57009246e-16, -1.57009246e-16],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]))
... và về cơ bản là anything that Matlab can.
WOW, cảm ơn rất nhiều. Đây là SUPER FAST so với các giải pháp khác. Nếu tôi có thể +100000, tôi sẽ – Richard
@Richard: Điều đó phụ thuộc ... danh sách càng lớn thì giải pháp hiểu và giải nén tốt hơn sẽ hoạt động tốt hơn, bởi vì họ không xem xét phần lớn các mục nhập ma trận. –
@jellybean: Tôi nghi ngờ rằng ... numpy thực sự được tối ưu hóa khá tốt. Tôi nghĩ rằng nó an toàn để nói rằng một slice đơn giản khôn ngoan sẽ không đọc toàn bộ ma trận. (Mặc dù tôi có thể sai, nhưng tôi không biết chi tiết thực hiện của C). Thực tế, tôi nghĩ rằng 'numpy' sẽ thực hiện * tốt hơn * với một danh sách lớn hơn, vì chi phí của kiểu' list' gốc của Python bắt đầu để thêm lên. Nhưng tất nhiên, chỉ có một cách để tìm ra! – katrielalex