numlowのネイティブ配列サポートを利用するために、SlowAESコード(http://anh.cs.luc.edu/331/code/aes.py)を再実装することを検討しています。 SlowAESの純粋なPythonがnumpyを使用して実装された同じ関数よりもはるかに高速であるという逆の直感的な結果が出てきています。ここに私が持っている最も明瞭な例があります。NUMPY純粋なPythonより大幅に遅いAESの実装
AESの主な操作の1つは、4x4要素バイト配列の各行がいくつかの位置(0行0、1行1など)だけシフトされたシフト行です。元のPythonコードは、その後、回転する仮想列を作成するスライスを使用して、一次元16要素のリストとして、この4×4バイトの状態列を扱う:
def rotate(word, n):
return word[n:] + word [0:n]
def shiftRows(state):
for i in range(4):
state[i*4:i*4+4] = rotate(state[i*4:i*4+4], -i)
は、時間的に16件の整数結果のリストを使用して、ShiftRows演算ではtimeitを実行します3.47マイクロ秒である。 4×4の整数入力配列を仮定
numpyの中に再実装この同じ機能は、単に次のようになります。
def shiftRows(state):
for i in range(4):
state[i] = np.roll(state[i],-i)
ただし、はtimeitは、これは16.3マイクロ秒の実行時間を有することを示しています。
私は、numpyの最適化された配列演算がいくらか高速なコードをもたらすことを期待していました。どこが間違っていますか?そして、純粋なPythonよりも速いAES実装をもたらすいくつかのアプローチがありますか?途中で結果が出たいので、pycryptoは適用されないかもしれません(ただし、遅すぎる場合は、もう一度見直す必要があります)。
07年9月7日 - 回答ありがとうございます。 「なぜ」という質問に答えるために、数百万ではないにしても数十万のサンプルの平文/暗号文ペアを実行することを検討しています。したがって、単一の暗号化の時間差はほとんど違いはありませんが、私が得ることができる時間を節約することは、長期的には大きな違いを生み出す可能性があります。
"純粋なPythonよりも速いAESの実装につながるアプローチがいくつかありますか?ほぼ確実です。 Cでそれを行い、Pythonへのバインディングをエクスポートします。しかし、私はこれがあなたが探している答えではないと思う。 –
「Numpy」は、通常、「切り取られた」ソースと比較して遅くなる「コントロール」が多いです。 https://github.com/numpy/numpy/blob/v1.11.0/numpy/core/numeric.py#L1335-L1401 – RafazZ
3.5と16マイクロ秒の間で、 'ロール'のコードを確認してください。この問題は10秒間または数分間話しているところまで拡大しますか?これが最適化のための最適化の問題でない限り、ここでは大きな問題は見られません。 –