Я нахожу (вопреки некоторым другим предположениям), что l.reverse()
- самый быстрый способ перевернуть длинный список в Python 3 и 2. Мне было бы интересно узнать, могут ли другие копировать эти моменты времени.
l[::-1]
, вероятно, медленнее, потому что он копирует список до его обращения. Добавление вызова list()
вокруг итератора, сделанного из reversed(l)
, должно добавить некоторые издержки. Конечно, если вам нужна копия списка или итератор, используйте эти соответствующие методы, но если вы хотите просто перевернуть список, то l.reverse()
, кажется, самый быстрый способ.
Функции
def rev_list1(l):
return l[::-1]
def rev_list2(l):
return list(reversed(l))
def rev_list3(l):
l.reverse()
return l
Список
l = list(range(1000000))
Время Python 3.5
timeit(lambda: rev_list1(l), number=1000)
# 6.48
timeit(lambda: rev_list2(l), number=1000)
# 7.13
timeit(lambda: rev_list3(l), number=1000)
# 0.44
Время Python 2.7
timeit(lambda: rev_list1(l), number=1000)
# 6.76
timeit(lambda: rev_list2(l), number=1000)
# 9.18
timeit(lambda: rev_list3(l), number=1000)
# 0.46
Ага. Это вполне возможно.
Возможно, вам потребуется указать имя класса для header_image
, так как это невозможно вывести. Включите также : independent =>: destroy
, чтобы гарантировать, что изображения будут уничтожены, если статья будет удалена
class Article < ActiveRecord::Base
has_one :header_image, :as => :imageable, :class_name => 'Image', :dependent => :destroy
has_many :images, :as => :imageable, :dependent => :destroy
end
, а затем на другом конце ...
class Image < ActiveRecord::Base
belongs_to :imageable, :polymorphic => true
end
Я пробовал это, но затем header_image возвращает одно из изображений. Просто потому, что в таблице изображений не указан другой тип использования изображения (header_image по сравнению с обычным изображением). Он просто говорит: imageable_type = Image для обоих вариантов использования. Поэтому, если информация о типе использования не хранится, ActiveRecord не сможет различить.