一百以內(nèi)質(zhì)數(shù)之和
判斷是否為質(zhì)數(shù)
判斷一個(gè)整數(shù)是否為質(zhì)數(shù)比較簡(jiǎn)單烦味,即除了自身和1以外不可被別的數(shù)整除。不過(guò)根據(jù)數(shù)學(xué)理論證明壁拉,不用從2檢查到n谬俄,到int(sqrt(n))+1即可,可以提高效率弃理。注意返回值為T(mén)rue或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值為T(mén)rue。之后再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