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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
<tt>
<div class="gmail_quote">Hi,<div><br></div><div>I just tried to build pycrypto for python-2.6.6 (x64) on Windows 7, for found that it can&#39;t build _fastmath because there is no GMP on Windows.</div><div><br></div><div>I google for a while and found MPIR (<a href="http://www.mpir.org/" target="_blank">http://www.mpir.org/</a>). There is a script &#39;to_gmp.bat&#39; in the MPIR build folder that rename mpir.lib, mpir.dll, and the relevant header files to gmp.</div><br>
<br>
<br>
<div><br></div><div>After trying for 4 hours, I got a solution. (it may not accurate right, but it just works.)</div><div><br></div><div>First, I build MPIR as Release|x86 for both lib and dll:</div><div><ul><li>open &quot;Visual Studio 2008 x64 Win64 Command Prompt&quot;</li><br>
<br>
<br>
<li>cd mpir-2.1.3\build.vc9 <font color="#009900"># Change to the path that you extract MPIR.</font></li><li>msbuild mpir.sln /p:Configuration=Release /p:Platform=x64 /t:lib_mpir_nehalem <font color="#009900"># &lt;-- my cpu, you can try others.</font></li><br>
<br>
<br>
<li>msbuild mpir.sln /p:Configuration=Release /p:Platform=x64 /t:dll_mpir_nehalem</li><li>to_gmp.bat <font color="#009900"># Convert libraries and headers to GMP.</font></li></ul><div>Then, copy *.h except config.h from <b><font color="#FF0000">DLL </font></b>output to your python\PC</div><br>
<br>
<br>
</div><div><ul><li>cd mpir-2.1.3\build.vc9\dll\x64\Release</li><li>mkdir C:\Python26\PC</li><li>copy gmp*.h C:\Python26\PC</li><li>copy mpir*.h C:\Python26\PC</li></ul><div>And copy gmp.lib from <b><font color="#FF0000">LIB </font></b>output to your python\PCbuild\amd64 <font color="#FF0000"># <i><b>Sound weird?</b></i> But trust me, I already try other ways and they were failed.</font></div><br>
<br>
<br>
</div><div><ul><li>mkdir C:\Python26\PCbuild</li><li>mkdir C:\Python26\PCbuild\amd64</li><li>cd mpir-2.1.3\build.vc9\lib\x64\Release</li><li>copy gmp.lib C:\Python26\PCbuild\amd64</li></ul><div>Now, in the extracted pycrypto folder, I copy src\_fastmath.c to src\_fastmath.cpp and do some changes on _fastmath.cpp to make it C++ friendly.</div><br>
<br>
<br>
</div><div>Well, the patch is quite large because I move the whole sieve_base to the very top of the file. So you better see the patch file that I&#39;m attached to this mail.</div><div>I also change the setup.py to build the _fastmath.cpp instead of _fastmath.c.</div><br>
<br>
<br>
<div>Finally, build the pycrypto and install it.</div><div><ul><li>python setup.py build</li><li>python setup.py install --optimize=1</li></ul><div>If you look in the C:\Python26\Lib\site-packages\Crypto\PublicKey, you will found _fastmath.pyd.</div><br>
<br>
<br>
</div><div>Now, the most excited part! Let&#39;s benchmark it.</div><div><br></div><div>Without _fastmath (you can try it by rename _fastmath.pyd to something such as _fastmath.xxx):</div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><br>
<br>
<br>
<div><div><font face="&#39;courier new&#39;, monospace">In [1]: from datetime import datetime</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><br>
<div><font face="&#39;courier new&#39;, monospace">In [2]: from Crypto.PublicKey import pubkey</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><br>
<div><font face="&#39;courier new&#39;, monospace">In [3]: def tdiff(n):</font></div><div><font face="&#39;courier new&#39;, monospace"> ...: before = datetime.now()</font></div><br>
<div><font face="&#39;courier new&#39;, monospace"> ...: pubkey.getStrongPrime(n)</font></div><div><font face="&#39;courier new&#39;, monospace"> ...: print datetime.now()-before</font></div><br>
<div><font face="&#39;courier new&#39;, monospace"> ...:</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [4]: tdiff(512)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:00.348000</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [5]: tdiff(1024)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:00.565000</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [6]: tdiff(2048)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:03.308000</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [7]: tdiff(4096)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:01:39.202000 # == (1*60)+39.202 == 99.202</font></div></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><br>
</blockquote><font face="arial, helvetica, sans-serif">With _fastmath:</font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="&#39;courier new&#39;, monospace"><br><br>
</font></div><div><font face="&#39;courier new&#39;, monospace">In [1]: from datetime import datetime</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><br>
<div><font face="&#39;courier new&#39;, monospace">In [2]: from Crypto.PublicKey import pubkey</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><br>
<div><font face="&#39;courier new&#39;, monospace">In [3]: def tdiff(n):</font></div><div><font face="&#39;courier new&#39;, monospace"> ...: before = datetime.now()</font></div><br>
<div><font face="&#39;courier new&#39;, monospace"> ...: pubkey.getStrongPrime(n)</font></div><div><font face="&#39;courier new&#39;, monospace"> ...: print datetime.now()-before</font></div><br>
<div><font face="&#39;courier new&#39;, monospace"> ...:</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [4]: tdiff(512)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:00.123000</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [5]: tdiff(1024)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:00.333000</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [6]: tdiff(2048)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:00.675000</font></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">In [7]: tdiff(4096)</font></div><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">0:00:06.446000</font></div></div><div><font face="&#39;courier new&#39;, monospace"><br></font></div></blockquote><font face="arial, helvetica, sans-serif">So, the conclusion:</font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><br>
<br>
<br>
<div><font face="&#39;courier new&#39;, monospace">n without with faster</font></div><div><font face="&#39;courier new&#39;, monospace"> _fastmath _fastmath</font></div><br>
<div><font face="&#39;courier new&#39;, monospace"><br></font></div><div><font face="&#39;courier new&#39;, monospace">512 0</font><span style="font-family:&#39;courier new&#39;, monospace">0.348 00.123 182.93%</span></div><br>
<br>
<br>
<div><span style="font-family:&#39;courier new&#39;, monospace">1024 00.565 00.333 69.67%</span></div><div><span style="font-family:&#39;courier new&#39;, monospace">2048 03.308 00.675 390.07%</span></div><br>
<br>
<br>
<div><span style="font-family:&#39;courier new&#39;, monospace">4096 99.202 06.446 1438.97%</span></div><div><span style="font-family:&#39;courier new&#39;, monospace"><br><br>
</span></div></blockquote><font face="arial, helvetica, sans-serif">So, I think it&#39;s really worth to do (if you&#39;re stuck on Windows Platform).</font><div><font face="arial, helvetica, sans-serif"><br><br>
</font></div><div><font face="arial, helvetica, sans-serif">Regards,</font></div><div><font face="arial, helvetica, sans-serif">Chaiwat.S</font></div><br>
</div><br><br>
</tt>
|