आप पाइथन/सी एपीआई का उपयोग करके एक पायथन स्ट्रिंग बना सकते हैं, जो कि पाइथन का उपयोग करने वाली किसी विधि से काफी तेज़ होगा, क्योंकि पाइथन स्वयं पाइथन/सी में लागू होता है। प्रदर्शन मुख्य रूप से यादृच्छिक संख्या जनरेटर की दक्षता पर निर्भर करेगा। आप एक उचित यादृच्छिक (3) कार्यान्वयन के साथ एक प्रणाली है, इस तरह के the one in glibc, के रूप में यादृच्छिक स्ट्रिंग के लिए एक कुशल कार्यान्वयन इस प्रकार दिखाई देगा पर हैं:
#include <Python.h>
/* gcc -shared -fpic -O2 -I/usr/include/python2.7 -lpython2.7 rnds.c -o rnds.so */
static PyObject *rnd_string(PyObject *ignore, PyObject *args)
{
const char choices[] = {'0', '1'};
PyObject *s;
char *p, *end;
int size;
if (!PyArg_ParseTuple(args, "i", &size))
return NULL;
// start with a two-char string to avoid the empty string singleton.
if (!(s = PyString_FromString("xx")))
return NULL;
_PyString_Resize(&s, size);
if (!s)
return NULL;
p = PyString_AS_STRING(s);
end = p + size;
for (;;) {
unsigned long rnd = random();
int i = 31; // random() provides 31 bits of randomness
while (i-- > 0 && p < end) {
*p++ = choices[rnd & 1];
rnd >>= 1;
}
if (p == end)
break;
}
return s;
}
static PyMethodDef rnds_methods[] = {
{"rnd_string", rnd_string, METH_VARARGS },
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initrnds(void)
{
Py_InitModule("rnds", rnds_methods);
}
परीक्षण halex के बेंचमार्क के साथ इस कोड से पता चलता है कि यह 280x की तुलना में तेजी है मूल कोड, और 2.3x halex के कोड की तुलना में तेजी (मेरी मशीन पर):
# the above code
>>> t1 = Timer("rnds.rnd_string(2**20)", "import rnds")
>>> sorted(t1.repeat(10,1))
[0.0029861927032470703, 0.0029909610748291016, ...]
# original generator
>>> t2 = Timer("''.join(random.choice('01') for x in xrange(2**20))", "import random")
>>> sorted(t2.repeat(10,1))
[0.8376679420471191, 0.840252161026001, ...]
# halex's generator
>>> t3 = Timer("bin(random.getrandbits(2**20-1))[2:].zfill(2**20-1)", "import random")
>>> sorted(t3.repeat(10,1))
[0.007007122039794922, 0.007027149200439453, ...]
एक परियोजना के लिए सी कोड को जोड़ने में एक जटिलता है, लेकिन एक महत्वपूर्ण आपरेशन के एक 280x speedup के लिए, यह अच्छी तरह से इसके लायक हो सकता है ।
आगे दक्षता में सुधार के लिए, तेजी से आरएनजी में देखें, और यादृच्छिक संख्या पीढ़ी को समानांतर करने के लिए उन्हें अलग थ्रेड से कॉल करें। उत्तरार्द्ध को यह सुनिश्चित करने के लिए लॉक-फ्री सिंक्रनाइज़ेशन तंत्र से लाभ होगा कि अंतर-थ्रेड संचार अन्यथा तेज़ पीढ़ी की प्रक्रिया को कम नहीं करता है।
बहुत बहुत धन्यवाद। – marshall
@marshall: आप इसे ['b2a_bin (os.urandom (2 ** i/8)) का उपयोग करके इसे और भी तेज कर सकते हैं '(सी सिंथॉन में लिखित विस्तार)] (https://gist.github.com/zed/ 3,526,111)। देखें [एक बड़ी संख्या में यादृच्छिक() (पायथन) गुणा करना) (http://stackoverflow.com/q/12161988/4279) – jfs
@ जेएफ। सेबेस्टियन धन्यवाद! – marshall