一百以內(nèi)質(zhì)數(shù)之和
判斷是否為質(zhì)數(shù)
判斷一個(gè)整數(shù)是否為質(zhì)數(shù)比較簡(jiǎn)單,即除了自身和1以外不可被別的數(shù)整除。不過(guò)根據(jù)數(shù)學(xué)理論證明,不用從2檢查到n,到int(sqrt(n))+1即可,可以提高效率。注意返回值為True或False,方便后續(xù)的boolean索引。
def is_prime(num):
if num <= 1:
return False
for i in range(2,int(np.sqrt(num))+1):
if num % i == 0:
return False
return True
利用循環(huán)
簡(jiǎn)單粗暴的方式,從1循環(huán)到100,一次判斷是否為質(zhì)數(shù),若是質(zhì)數(shù),則加到ans上,若不是直接跳過(guò)。因?yàn)?%timeit會(huì)執(zhí)行1000,所以跑完代碼就comment out了。
def prime_sum_iter(n=100):
ans = 0
for i in range(1,n+1):
if is_prime(i):
ans += i
return ans
print prime_sum_iter()
# %%timeit
# 1000 loops, best of 3: 253 μs per loop
1060
利用np向量化方法
利用numpy可以向量化,用更簡(jiǎn)潔的方式遍歷所有的元素。向量化的理解,就本例子而言,循環(huán)的思想是每次取一個(gè)數(shù),對(duì)其判斷是否為質(zhì)數(shù);向量化是取這個(gè)數(shù)組為變量,直接對(duì)其所有元素判斷是否為質(zhì)數(shù),然后返回一個(gè)同size的數(shù)組。由于is_prime()函數(shù)本身接受單個(gè)integer,如要接受向量、數(shù)組等變量,需要對(duì)函數(shù)進(jìn)行向量話,is_prime_vec = np.vectorize(is_prime)。
np.vectorize: Define a vectorized function which takes a nested sequence of objects or numpy arrays as inputs and returns a numpy array as output,具體可參考文檔。
is_prime_vec(np_arr)返回一個(gè)布爾型數(shù)組,比如np_arr = array([1,2,3,4]);那is_prime_vec(np_arr)返回array([False, True, True, False]),因?yàn)?,3是質(zhì)數(shù),1,4不是。np_arr[is_prime_vec(np_arr)]是布爾索引,簡(jiǎn)單講就是返回對(duì)應(yīng)True的元素,這里會(huì)返回array([2,3]),因?yàn)?,3對(duì)應(yīng)的boolean值為True。之后再sum就實(shí)現(xiàn)了和循環(huán)一樣的功能。
def prime_sum_vect(n=100):
np_arr = np.arange(1,n+1)
is_prime_vec = np.vectorize(is_prime)
return np.sum(np_arr[is_prime_vec(np_arr)])
print prime_sum_vect()
# %%timeit
# 1000 loops, best of 3: 286 μs per loop
1060