忍者ブログ
CUDA+GPGPU、C++、C#などのプログラムについての備忘録がわり
[66] [65] [64] [63] [62] [61] [60] [59] [58] [57] [56
Posted by - 2024.04.25,Thu
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Posted by サンマヤ - 2013.04.17,Wed
急に仕事が増え、時間がなくなってしまったのですが、
できる限り記事を増やしていきたいと思います。

今回は、前回の処理を改良してみたいと思います。



さっそく、プログラムリストから。

prime2.py
 1 #! c:/python27/python.exe
 2 
 3 import timeit
 4 
 5 def notFactor(x,a):
 6     return x % a != 0
 7 
 8 def PrimeNumber2():
 9     number_list = range(2,1000)
10     number_list.reverse()
11     prime_list = []
12     while len(number_list)>0:
13         a = number_list.pop()
14         prime_list.append(a)
15         number_list = filter( lambda x : notFactor(x,a), number_list)
16 
17     print "number\n"
18     print number_list
19     print "prime numbers are\n"
20     print prime_list
21 
22 
23 if __name__ == "__main__":
24     PrimeNumber2()
今回の変更点は、ラムダ式を使い、一括で要素の取捨選択をするfilterを使用していることです。
分かりやすいように、割り切れない場合に真になる関数を作りました。
ラムダ式がない場合、2で割る関数、3で割る関数と用意しなければならないのですが、
(関数の働きをするオブジェクトを作るなど)
ここでは、filterの呼び出しごとに、a(見つかった素数)で割る関数が定義しなおされることになります。

こうすることによって、内部のアルゴリズムはわかりませんが、
関数の戻り値が真になるものだけが残ります。
プログラムとしてもすっきりします。

実際、timeit関数を使って、10000未満の素数生成を10回繰り返した時間を計ってみました。
前回のプログラム
7.99秒
今回のプログラム
2.89秒
ということで、2倍以上はやくなりました。
いろいろな意味で、組み込みの関数は最適化されているのでしょう。
見た目にも、パフォーマンス的にも、
filterなどを積極的に使っていったほうがいいようです。


PR
Comments
Post a Comment
Name :
Title :
E-mail :
URL :
Comments :
Pass :   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
フリーエリア
最新コメント
[11/19 矢野 忠]
[02/25 山本義和]
[07/08 hirota]
[07/06 hirota]
[02/05 矢野 忠]
最新トラックバック
プロフィール
HN:
サンマヤ
性別:
非公開
職業:
プログラマ
趣味:
ゲーム
バーコード
ブログ内検索
カウンター
忍者アナライズ
Template by mavericyard*
Powered by "Samurai Factory"
忍者ブログ [PR]