Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder1.news.weretis.net!feeder.erje.net!eu.feeder.erje.net!xlned.com!feeder3.xlned.com!newsfeed.xs4all.nl!newsfeed3.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.001 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'algorithm': 0.04; '21,': 0.07; 'explicit': 0.07; 'wednesday,': 0.07; '22,': 0.09; '[1]:': 0.09; '[2]:': 0.09; '[3]:': 0.09; 'marking': 0.09; 'methods,': 0.09; 'subject:number': 0.09; 'question.': 0.14; 'dictionary.': 0.16; 'division.': 0.16; 'doubles': 0.16; 'from:addr:rosuav': 0.16; 'from:name:chris angelico': 0.16; 'lambda': 0.16; 'loop.': 0.16; 'multiples': 0.16; 'readability': 0.16; 'simple.': 0.16; 'subject:Prime': 0.16; 'subject:generator': 0.16; '{2:': 0.16; 'wrote:': 0.18; 'trying': 0.19; 'thu,': 0.19; 'unlike': 0.19; 'not,': 0.20; 'memory': 0.22; 'otherwise,': 0.22; 'stick': 0.24; 'first,': 0.26; 'pass': 0.26; 'header:In-Reply-To:1': 0.27; 'function': 0.29; 'chris': 0.29; 'am,': 0.29; 'start,': 0.30; 'message-id:@mail.gmail.com': 0.30; 'figure': 0.32; 'run': 0.32; 'but': 0.35; 'received:google.com': 0.35; 'there': 0.35; 'picking': 0.36; 'next': 0.36; 'thanks': 0.36; "i'll": 0.36; 'so,': 0.37; 'list.': 0.37; 'performance': 0.37; 'improving': 0.38; 'to:addr:python-list': 0.38; 'fact': 0.38; 'does': 0.39; 'bad': 0.39; 'to:addr:python.org': 0.39; 'either': 0.39; 'skip:u 10': 0.60; 'july': 0.63; 'total': 0.65; '20,': 0.68; 'records': 0.73; 'jul': 0.74; 'lowest': 0.74; 'prime': 0.74; '11:': 0.84; '13:': 0.84; 'etc,': 0.84; 'moves': 0.84; 'severe': 0.91; '2013': 0.98 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=Jp5iYq3w9SQnC2eqWY23oJRUokj+Ng/VjUjlnC/46T0=; b=szv2rJdh8sEZcfJsXu8O0lvPei2JaXDH4cRgughFkcITefGV/y3fwg+tqokABcy+CJ sQHDRumXZ8r4V1VvVOY/syXu17gWL9RD2PaqokDPSlBuKfchkDSSuYxG0RT8jMLljq2z VsDLz9vFZ34gEIpXTVw99fphqTGKkUTy742teUkuCqS1kOR+QIXIKrhOLg7j8QAh+Rqk heMUUJFwBmUXmLH75B5IiLluwWqeWdK3dRWP1Q7Uxgkmc1lCUvSSozosrAEvnJMWfkk8 E7vbPsYC2AhL8Yw82MZ4SBGLlKIuLSzgg8t6LBxVHlH4HUCXdIjAAmyCkQX7LwuZNre6 FbxA== MIME-Version: 1.0 X-Received: by 10.220.182.193 with SMTP id cd1mr19482074vcb.32.1373469139139; Wed, 10 Jul 2013 08:12:19 -0700 (PDT) In-Reply-To: <15167633-b6e7-46cc-a043-8dfe8aaad11e@googlegroups.com> References: <15167633-b6e7-46cc-a043-8dfe8aaad11e@googlegroups.com> Date: Thu, 11 Jul 2013 01:12:19 +1000 Subject: Re: Prime number generator From: Chris Angelico To: python-list@python.org Content-Type: text/plain; charset=ISO-8859-1 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 36 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1373469147 news.xs4all.nl 15992 [2001:888:2000:d::a6]:56329 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:50363 On Thu, Jul 11, 2013 at 12:35 AM, Bas wrote: > On Wednesday, July 10, 2013 4:00:59 PM UTC+2, Chris Angelico wrote: > [...] >> So, a few questions. Firstly, is there a stdlib way to find the key >> with the lowest corresponding value? In the above map, it would return >> 3, because 18 is the lowest value in the list. I want to do this with >> a single pass over the dictionary. > > In [1]: prime = {2: 20, 3: 18, 5: 20, 7: 21, 11: 22, 13: 26} > > In [2]: smallest_key = min(prime.iteritems(), key=lambda k_v: k_v[1])[0] > > In [3]: smallest_key > Out[3]: 3 Well, that does answer the question. Unfortunately the use of lambda there has a severe performance cost (roughly doubles the total run time, when I ask for the thousandth prime), without majorly improving readability. I'll bear it in mind if there's a way to make that work on either readability or performance, but otherwise, I'll stick with the explicit loop. Thanks anyway! > Still trying to figure out your algorithm ... It's pretty simple. (That's a bad start, I know!) Like the Sieve of Eratosthenes, it locates prime numbers, then deems every multiple of them to be composite. Unlike the classic sieve, it does the "deem" part in parallel. Instead of marking all the multiples of 2 first, then picking three and marking all the multiples of 3, then 5, etc, this function records the fact that it's up to (say) 42 in marking multiples of 2, and then when it comes to check if 43 is prime or not, it moves to the next multiple of 2. This requires memory to store the previously-known primes, similarly to other methods, but needs no multiplication or division. ChrisA