Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Very fast sampling from a set with fixed number of elements in python

I need to sample uniformly at random a number from a set with fixed size, do some calculation, and put the new number back into the set. (The number samples needed is very large)

I've tried to store the numbers in a list and use random.choice() to pick an element, remove it, and then append the new element. But that's way too slow!

I'm thinking to store the numbers in a numpy array, sample a list of indices, and for each index perform the calculation.

  • Are there any faster way of doing this process?
like image 219
user972432 Avatar asked Oct 19 '11 00:10

user972432


1 Answers

Python lists are implemented internally as arrays (like Java ArrayLists, C++ std::vectors, etc.), so removing an element from the middle is relatively slow: all subsequent elements have to be reindexed. (See http://www.laurentluce.com/posts/python-list-implementation/ for more on this.) Since the order of elements doesn't seem to be relevant to you, I'd recommend you just use random.randint(0, len(L) - 1) to choose an index i, then use L[i] = calculation(L[i]) to update the ith element.

like image 189
ruakh Avatar answered Oct 14 '22 07:10

ruakh