Почему дела [] здесь такие медленные? Есть ли какие-нибудь уловки, чтобы ускорить это?

При попытке вставить изображения я заметил, что Cases [] очень медленный.

Для воспроизведения сначала скопируйте большое изображение в буфер обмена (просто нажмите Print Screen ), затем оцените следующее:

In[33]:= SetSystemOptions["PackedArrayOptions" -> "UnpackMessage" -> True];

In[34]:= AbsoluteTiming[nb = NotebookGet@ClipboardNotebook[];]
Out[34]= {0.4687500, Null}

In[35]:= AbsoluteTiming[d1 = nb[[1, 1, 1, 1, 1, 1, 1]];]
Out[35]= {0., Null}

In[36]:= AbsoluteTiming[d2 = First@Cases[nb, r_RasterBox :> First[r], Infinity, 1];]

During evaluation of In[36]:= Developer`FromPackedArray::unpack: Unpacking array in call to Notebook. >>

Out[36]= {0.9375000, Null}

(Я делал это в Windows, не уверен, что это код вставки. то же самое и в других системах.)

Обратите внимание, что извлечение данных с использованием Cases происходит очень медленно по сравнению с использованием Part напрямую, хотя я явно говорю Cases , что Мне нужна только одна спичка.

Я обнаружил (как показано выше), что Cases по какой-то причине запускает распаковку, даже если поиск должен остановиться до того, как он достигнет упакованного массива внутри. Использование более мелкой спецификации уровня, чем Infinity , может избежать распаковки.

Вопрос: Использование Cases здесь проще и надежнее, чем Часть (что, если подвыражение может появляться в разных позициях?) Есть ли способ сделать Здесь дела работают быстро, возможно, используя другой шаблон или другие параметры?


Возможно связанный вопрос: Сопоставление с образцом в системе Mathematica плохо оптимизировано? (Вот почему я изменил правило Cases с RasterBox [data_, ___] -> data на r_RasterBox:> First [r] .)

12
задан Community 23 May 2017 в 12:08
поделиться