私は、Web上の多くの場所で、配列式を使用する際の弱点の1つが遅いことを読んでいます(中間のヘルパー列を使用すると速度が上がることがあります)。Excel配列の式が遅いのはなぜですか?
一般的な説明は、彼らが多くの仕事をしているということです。彼らはそうですが、ヘルパーの公式は、確かに異なる細胞にまたがる同じ量の仕事を再現しなければなりません。
私はもう少し詳細に理解したいと思います:
- 配列数式が遅いのはなぜ?
- どのような状況でそうでないかもしれませんか?
私は、Web上の多くの場所で、配列式を使用する際の弱点の1つが遅いことを読んでいます(中間のヘルパー列を使用すると速度が上がることがあります)。Excel配列の式が遅いのはなぜですか?
一般的な説明は、彼らが多くの仕事をしているということです。彼らはそうですが、ヘルパーの公式は、確かに異なる細胞にまたがる同じ量の仕事を再現しなければなりません。
私はもう少し詳細に理解したいと思います:
のは、具体的な例を持ってみましょう:
式:D2:E11
で
:
=IF($A2=D$1,$B2)
D12
で
とE12
:
=SUM(D2:D11)
D13
で
とE13
:[Ctrlキー] + [SHIFT] +
D14
で
とE14
[入力]で確認配列数式として
{=SUM(IF($A$2:$A$11=D$1,$B$2:$B$11))}
:
=SUMIF($A$2:$A$11,D$1,$B$2:$B$11)
だからA2:B11
で何かが変わるとどうなりますか?
ヘルパー列では、実際に変更されたセルを参照する式を再計算する必要があります。もちろん、D12
とE12
の合計を再計算する必要があります。しかし、これは正確にExcelが開発された理由です。だから、プログラムはおそらくこれを実行するように最適化されています。
実際に変更されたセルとは関係なく、アレイ式を完全に再計算する必要があります。それはIF
の機能で、A2:B11
の各変更後のSUM
です。そして、最適化されたものはありません。配列のコンテキストでは、IF
関数のみが発生します。これは、デフォルトでは1つの条件と1つのvalue_if_the_criteria_is_trueが条件式配列の各条件に対して複数回実行され、結果配列が提供され、次に合計がSUM
になります。また、SUMIF
も完全に再計算する必要があります。しかし、これはプリコンパイルされた関数SUMIF
で実行され、最適化されています。この関数は配列式と同じように、単にIF
関数を10回呼び出すだけではありません。
パフォーマンスになると、ヘルパー列を含むソリューションが最適になり、次にSUMIF
となり、配列の公式は確かに最低の性能を持つソリューションになります。
もちろん、パフォーマンスの違いは、数式に影響を与えるデータセルが多い場合や、シートに配列式が多い場合にのみ顕著になります。したがって、配列式を使用する必要がある場合、それらは配列として列または行全体を取るべきではなく、何千もの配列式をシートに入れてはなりません。
Excelのソースコードは表示されないので、これは何よりも多くの意見を生成すると思います。しかし、ソースコード内のループを使って配列の式を推測すると、オーバーヘッドが増えます。 –
あなたはこの質問のためにgoogledしましたか?いくつかの理由がありますが、その1つは式の長さです。 [このページ](http://chandoo.org/wp/2012/03/20/optimize-speedup-excel-formulas/)には数式の最適化が行われます。これにはなぜ速度が遅くなるかも含まれます。 [ここに別の良いページがあります](http://www.decisionmodels.com/optspeedj.htm)もあります。これは一般的にコードレビューのためのSOのためのかなり広い質問です。これはかなり主観的になるでしょう...(編集:と第3ページ(http://www.ozgrid.com/Excel/Arrays.htm)) – BruceWayne
@MacroManのループは、基になるソースコード内では非常に頻繁に実行されます。たとえば、Pythonをインタプリタで書くと、コンパイル済みのCループを使用しているため、計算を高速化するために配列数式を使用することをお勧めします。 – Sam