用python不到3秒找出1亿以内的质数

# -*- coding: utf-8 -*-

import sys, time
import numpy as np

def find_prime(upper):
    """找出小于upper的所有质数"""
    
    prime_list = list()
    mid = int(np.sqrt(upper))
    nums = np.arange(upper)
    nums[1] = 0
    
    while True:
        primes = nums[nums>0]
        if primes.any():
            p = primes[0]
            prime_list.append(p)
            nums[p::p] = 0
            if p > mid:
                break
        else:
            break
    
    prime_list.extend(nums[nums>0].tolist())
    return prime_list

def fast_find_prime(upper, base=100000, block=20000000):
    """快速找出小于upper的所有质数"""
    
    if upper <= base:
        return find_prime(upper)
        
    mid = int(np.sqrt(upper))
    prime_list = find_prime(base)
    prime_array = np.array(prime_list)
    prime_array = prime_array[prime_array<=mid]
    
    start = base
    while start < upper:
        end = start + block
        if end > upper:
            end = upper
        print((start, end))
        
        prime_list.extend(process_func(start, np.copy(prime_array), (start, end)))
        start += block
    
    return prime_list


def process_func(id, primes, task_range):
    """执行分块任务的函数
    
    primes      - 用以剔除非质数的质数表
    task_range  - 分块任务的数值范围
    """
    
    nums = np.arange(task_range[0], task_range[1])
    for p in primes:
        k = (p-task_range[0]%p)%p
        nums[k::p] = 0
    
    return nums[nums>0].tolist()

upper = 100000000
t0 = time.time()
prime_list = fast_find_prime(upper)
t1 = time.time()
print('查找%d以内的质数耗时%0.3f秒,共找到%d个质数'%(upper, t1-t0, len(prime_list)))

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值