Например,
And @@ Thread[A >= B]
должен делать эту работу.
EDIT: С другой стороны, это
cmp = Compile[
{
{a, _Integer, 1},
{b, _Integer, 1}
},
Module[
{flag = True},
Do[
If[Not[a[[p]] >= b[[p]]], flag = False; Break[]],
{p, 1, [email protected]}];
flag],
CompilationTarget \[Rule] "C"
]
в 20 раз быстрее. 20 раз уродливый тоже.
EDIT 2: Поскольку у Дэвида нет компилятора C, вот все результаты синхронизации с двумя отличиями. Во-первых, его второй метод был исправлен для сравнения всех элементов. Во-вторых, я сравниваю a
с самим собой, что является наихудшим случаем (в противном случае мой второй метод, приведенный выше, должен будет только сравнивать элементы до первого, чтобы нарушить условие).
(*OP's method*)
And @@ Table[a[[i]] >= b[[i]], {i, 10^6}] // Timing
(*acl's uncompiled method*)
And @@ Thread[a >= b] // Timing
(*Leonid's method*)
lessEqual[a, b] // Timing
(*David's method #1*)
NonNegative[Min[a - b]] // Timing
(*David's method #2*)
Timing[result = True;
n = 1; While[n < Length[a],
If[a[[n]] < b[[n]], result = False; Break[]];
n++]; result]
(*acl's compiled method*)
cmp[a, a] // Timing
Так скомпилированный метод намного быстрее (обратите внимание, что второй метод Давида и скомпилированный метод здесь тот же самый алгоритм, и единственным отличием является накладные расходы).
Все это на аккумуляторе, поэтому возможны случайные колебания, но я думаю, что они являются репрезентативными.
EDIT 3: Если, как ruebenko предложил в комментарии, я заменяю Part
с Compile`GetElement
, как этот
cmp2 = Compile[{{a, _Integer, 1}, {b, _Integer, 1}},
Module[{flag = True},
Do[If[Not[Compile`GetElement[a, p] >= Compile`GetElement[b, p]],
flag = False; Break[]], {p, 1, [email protected]}];
flag], CompilationTarget -> "C"]
затем cmp2
это вдвое быстрее, чем cmp
.
Ницца. Быстро и просто. +1 –
Спасибо, Леонид. – DavidC
Обратите внимание, что поскольку вы генерируете случайные списки, ваш последний метод (в котором есть странные жестко закодированные константы, но я предполагаю, что это остатки из вашего кода разработки. В любом случае, они делают это неправильно здесь, но давайте не будем это игнорировать) получает несправедливое преимущество, поскольку статистически нарушение условий произойдет очень рано в цикле. Вы также должны проверить списки, в которых результат будет «True», и в этом случае списки верхнего уровня гарантированно будут медленнее. Фактически, ваш последний метод - это вариант верхнего уровня скомпилированного кода @acl. –