0

私はPythonで小さなプログラムを書いて、さまざまな数字と単語のセットからパスワードのすべての組み合わせを生成するのに役立ちます.可能なすべての組み合わせを生成したかったのですが、唯一の問題は、リストが何時間も続くように見えるため、最終的にメモリが不足して終了しないことです。

続行できるようにメモリをダンプする必要があると言われましたが、これが正しいかどうかはわかりません。この問題を回避する方法はありますか?

これは私が実行しているプログラムです:

#!/usr/bin/python
import itertools
gfname = "name"
tendig = "1234567890"
sixteendig = "1111111111111111"
housenum = "99"
Characterset1 = "&&&&"
Characterset2 = "££££"
daughternam = "dname"
daughtyear = "1900"
phonenum1 = "055522233"
phonenum2 = "3333333"





mylist = [gfname, tendig, sixteendig, housenum, Characterset1,
          Characterset2, daughternam, daughtyear, phonenum1, phonenum2]
for length in range(1, len(mylist)+1):
    for item in itertools.permutations(mylist, length):
            print "".join(item)

明らかな理由でいくつかのセットを取り出し、数字と単語を変更しましたが、これは大まかなプログラムです。

別のことは、特定の単語が欠落している可能性がありますが、生成されたすべてのパスワードの前に配置される可能性があることを知っているため、リストに入れたくありませんでした。私のプログラムにプレフィックスを追加する方法を知っている人はいますか?

悪い文法で申し訳ありません。助けてくれてありがとう。

4

4 に答える 4

1

以前guppyはメモリ使用量を理解していましたが、OPコードを少し変更しました(#!!!とマーク)

import itertools
gfname = "name"
tendig = "1234567890"
sixteendig = "1111111111111111"
housenum = "99"
Characterset1 = "&&&&"
Characterset2 = u"££££"
daughternam = "dname"
daughtyear = "1900"
phonenum1 = "055522233"
phonenum2 = "3333333"

from guppy import hpy # !!!
h=hpy()               # !!!
mylist = [gfname, tendig, sixteendig, housenum, Characterset1,
          Characterset2, daughternam, daughtyear, phonenum1, phonenum2]
for length in range(1, len(mylist)+1):
    print h.heap() #!!!
    for item in itertools.permutations(mylist, length):
            print item # !!!

h.heap()Guppyは、が呼び出されるたびにこのようなものを出力します。

Partition of a set of 25914 objects. Total size = 3370200 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  11748  45   985544  29    985544  29 str
     1   5858  23   472376  14   1457920  43 tuple
     2    323   1   253640   8   1711560  51 dict (no owner)
     3     67   0   213064   6   1924624  57 dict of module
     4    199   1   210856   6   2135480  63 dict of type
     5   1630   6   208640   6   2344120  70 types.CodeType
     6   1593   6   191160   6   2535280  75 function
     7    199   1   177008   5   2712288  80 type
     8    124   0   135328   4   2847616  84 dict of class
     9   1045   4    83600   2   2931216  87 __builtin__.wrapper_descriptor

ランニングpython code.py > code.logfgrep Partition code.logショー。

Partition of a set of 25914 objects. Total size = 3370200 bytes.
Partition of a set of 25924 objects. Total size = 3355832 bytes.
Partition of a set of 25924 objects. Total size = 3355728 bytes.
Partition of a set of 25924 objects. Total size = 3372568 bytes.
Partition of a set of 25924 objects. Total size = 3372736 bytes.
Partition of a set of 25924 objects. Total size = 3355752 bytes.
Partition of a set of 25924 objects. Total size = 3372592 bytes.
Partition of a set of 25924 objects. Total size = 3372760 bytes.
Partition of a set of 25924 objects. Total size = 3355776 bytes.
Partition of a set of 25924 objects. Total size = 3372616 bytes.

これは、メモリフットプリントがかなり一貫していることを示していると思います。

確かに、私はからの結果を誤解している可能性がありますguppy。テスト中に、オブジェクト数が増加したかどうかを確認するために、意図的に新しい文字列をリストに追加しましたが、増加しました。

興味のある人のために、私はOSX-MountainLionにそのようなグッピーをインストールしなければなりませんでした pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy

要約すると、完全なOPデータセットを使用していないことは確かですが、メモリ不足の問題ではないと思います。

于 2013-02-03T13:48:54.057 に答える
0

ファイルをメモ帳に出力する場合は、@ shaunからの上記のコメントに答えるには、次のようにファイルを実行します。

Myfile.py> output.txt

テキストファイルが存在しない場合は作成されます。

編集:

コードの下部にある次の行を置き換えます。

print "" .join(item)

これとともに:

with open ("output.txt","a") as f:
    f.write('\n'.join(items))
f.close

これにより、output.txtというファイルが生成されます。動作するはずです(テストされていません)

于 2013-02-03T13:47:35.870 に答える
0

デバッグ ツールにIronPythonと Visual Studio を使用するのはどうでしょうか (どちらも非常に優れています)。実行を一時停止して、メモリ (基本的にはメモリ ダンプ) を確認できるはずです。

于 2013-02-03T13:04:39.810 に答える
0

ご存じのように、プログラムは単独で非常に効率的に実行されます。ただし、たとえば IDLE で実行しないように注意してください。これにより、IDLE が画面をより多くの行で更新するにつれて、速度が遅くなります。出力をファイルに直接保存します。

さらに良いことに、パスワードを知ったら何をするか考えたことはありますか? 失われたアカウントにコマンド ラインからログオンできる場合は、後で使用するためにすべてのパスワードを保存するのではなく、すぐにログオンしてみてください。

for length in range(1, len(mylist)+1):
    for item in itertools.permutations(mylist, length):
        password = "".join(item)
        try_to_logon(command, password)
于 2013-02-03T18:24:05.917 に答える