Я имею два, выстраивают, я должен объединиться, и использование Объединения (|), оператор является КРАЙНЕ медленным.. там какие-либо другие пути состоят в том, чтобы выполнить слияние массива?
Кроме того, массивы заполнены объектами, не строками.
Пример объектов в массиве
#<Article
id: 1,
xml_document_id: 1,
source: "<article><domain>events.waikato.ac</domain><excerpt...",
created_at: "2010-02-11 01:32:46",
updated_at: "2010-02-11 01:41:28"
>
Где источник является короткой частью XML.
Править
Прошу прощения! 'Слиянием' я подразумеваю, что не должен вставлять дубликаты.
A => [1, 2, 3, 4, 5]
B => [3, 4, 5, 6, 7]
A.magic_merge(B) #=> [1, 2, 3, 4, 5, 6, 7]
При понимании, что целые числа являются на самом деле объектами Статьи, и оператор Union, кажется, берет навсегда
Я счел эту презентацию очень полезной.
Как я распространяю приложения Python в Windows - py2exe & InnoSetup
С сайта:
-121--723032-Существует множество вариантов развертывания Код Питона. Я поделюсь тем, что имеет хорошо работал для меня на Windows, средства командной строки упаковки и служб, использующих py2exe и InnoSetup. Я продемонстрирую простой сценарий сборки который создает двоичные файлы Windows и Программа установки InnoSetup за один шаг. В кроме того, я перейду к обычным ошибкам которые появляются при использовании py2exe и советы по их устранению. Это короткая речь, так что будет последующая сессия Open Space для обмена информацией опыт и помощь друг другу в решении проблемы распространения.
Если вам нужно чистое решение Java, попробуйте JWebEngine . Это рендеринг HTML 4 очень хорошо. Его можно использовать в апплете, Java webstart и на любой платформе. Использование очень простое.
-121--901072- Вот сценарий, в котором проверяются два метода слияния: использование оператора pipe ( a1 | a2
) и использование concatenate-and-uniq ( (a1 + a2) .uniq
). Два дополнительных критерия дают время конкатената и уника по отдельности.
require 'benchmark'
a1 = []; a2 = []
[a1, a2].each do |a|
1000000.times { a << rand(999999) }
end
puts "Merge with pipe:"
puts Benchmark.measure { a1 | a2 }
puts "Merge with concat and uniq:"
puts Benchmark.measure { (a1 + a2).uniq }
puts "Concat only:"
puts Benchmark.measure { a1 + a2 }
puts "Uniq only:"
b = a1 + a2
puts Benchmark.measure { b.uniq }
На моей машине (Ubuntu Karmic, Ruby 1,8,7) я получаю выходные данные так:
Merge with pipe:
1.000000 0.030000 1.030000 ( 1.020562)
Merge with concat and uniq:
1.070000 0.000000 1.070000 ( 1.071448)
Concat only:
0.010000 0.000000 0.010000 ( 0.005888)
Uniq only:
0.980000 0.000000 0.980000 ( 0.981700)
Что показывает, что эти два метода очень похожи по скорости, и что uniq
является большей составляющей операции. Это имеет смысл интуитивно, будучи O (n) (в лучшем случае), тогда как простая конкатенация - O (1).
Поэтому, если вы действительно хотите ускорить это, вам нужно посмотреть, как оператор < = >
реализован для объектов в массивах. Я считаю, что большая часть времени тратится на сравнение объектов, чтобы обеспечить неравенство между любой парой в конечном массиве.
Использование метода Array # concat
, вероятно, будет намного быстрее, согласно моим первоначальным тесты с использованием Ruby 1.8.7:
require 'benchmark'
def reset_arrays!
@array1 = []
@array2 = []
[@array1, @array2].each do |array|
10000.times { array << ActiveSupport::SecureRandom.hex }
end
end
reset_arrays! && puts(Benchmark.measure { @array1 | @array2 })
# => 0.030000 0.000000 0.030000 ( 0.026677)
reset_arrays! && puts(Benchmark.measure { @array1.concat(@array2) })
# => 0.000000 0.000000 0.000000 ( 0.000122)
Попробуйте это и посмотрите, будет ли это быстрее
a = [1,2,3,3,2]
b = [1,2,3,4,3,2,5,7]
(a+b).uniq
Нужно ли вам, чтобы элементы располагались в определенном порядке в массивах? Если нет, то вы можете проверить, ускорит ли использование Set
ов.
Обновление
Добавление к коду другого автора ответа:
require "set"
require "benchmark"
a1 = []; a2 = []
[a1, a2].each do |a|
1000000.times { a << rand(999999) }
end
s1, s2 = Set.new, Set.new
[s1, s2].each do |s|
1000000.times { s << rand(999999) }
end
puts "Merge with pipe:"
puts Benchmark.measure { a1 | a2 }
puts "Merge with concat and uniq:"
puts Benchmark.measure { (a1 + a2).uniq }
puts "Concat only:"
puts Benchmark.measure { a1 + a2 }
puts "Uniq only:"
b = a1 + a2
puts Benchmark.measure { b.uniq }
puts "Using sets"
puts Benchmark.measure {s1 + s2}
puts "Starting with arrays, but using sets"
puts Benchmark.measure {s3, s4 = [a1, a2].map{|a| Set.new(a)} ; (s3 + s4)}
дает (для ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0])
Merge with pipe:
1.320000 0.040000 1.360000 ( 1.349563)
Merge with concat and uniq:
1.480000 0.030000 1.510000 ( 1.512295)
Concat only:
0.010000 0.000000 0.010000 ( 0.019812)
Uniq only:
1.460000 0.020000 1.480000 ( 1.486857)
Using sets
0.310000 0.010000 0.320000 ( 0.321982)
Starting with arrays, but using sets
2.340000 0.050000 2.390000 ( 2.384066)
Предполагает, что множества могут быть или не быть быстрее, в зависимости от ваших обстоятельств (много слияний или мало слияний).