我正在研究项目euler中的问题401,我在python中编写了我的解决方案,但它需要几天才能运行,显然我需要加速它或使用不同的方法.我在Haskell中遇到了一个与我的python解决方案几乎完全相同的解决方案,但几乎是瞬间完成的.
有人可以解释它是如此之快吗?(我不是要求帮助或解决问题401)
divisors n = filter (\x -> n `mod` x == 0) [1..(n`div`2)] ++ [n]
sigma2 n = sum $ map (\x -> x * x) (divisors n)
sigma2big n = sum $ map (sigma2)[1..n]
let s2b = sigma2big 10^15
putStrLn ("SIGMA2(10^15) mod 10^9 is " ++ (show (mod s2b 10^9)))
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它只是使用试验除法生成一个除数列表,对它们进行平方和求和,然后将结果从1加到n.
编辑:忘了我的python代码
from time import clock
def timer(function):
def wrapper(*args, **kwargs):
start = clock()
print(function(*args, **kwargs))
runtime = clock() - start
print("Runtime: %f seconds." % runtime) …
Run Code Online (Sandbox Code Playgroud) 对不起,如果这太模糊了.我最近阅读了有关python的list.sort()方法的内容,并且因为性能原因读到它是用C语言编写的.
我假设python代码只是将列表传递给C代码并且C代码传回一个列表,但是python代码如何知道传递它的位置或者C给它正确的数据类型,以及如何C代码知道它给出的数据类型是什么?
所以我有一个函数可以给我随机位 rand(0,1) 我想将其推广到 rand(a,b) ,它给我一个范围为 a 到 b 的随机数。
我的想法是只计算 b - a 中的位数,然后将它们附加在一起。我认为这会起作用,但不会是统一的。我觉得它会偏向较大的数字而不是较小的数字(接近 a 的数字)。并不是真的要求一个直接的答案,只是一些帮助就很好了。
编辑:这是我到目前为止的想法,只是不确定制服部分
pseudo code:
function rand_range(a, b):
n = b - a
sum = a
for i in range(n):
sum += rand(0,1)
return sum
Run Code Online (Sandbox Code Playgroud) 所以我使用python和beautifulsoup4(我没有绑定)来刮网站.问题是当我使用urlib抓取页面的html时,它不是整个页面,因为其中一些是通过javascript生成的.有没有办法解决这个问题?
在我的django项目中,我有一个inmemoryuploadedfile,然后用Pillow打开它,旋转它,然后保存回自己。但是,最后一步实际上不起作用。当我将其保存到文件中时,将保存正确的(旋转的)图像。如何保存回文件对象而不是实际文件?
image = request.FILES['file']
img = Image.open(image)
img = img.rotate(90)
img.save("sample.jpeg", "jpeg") #this is correct
img.save(image, "jpeg") #this does not change the actual in memory image
Run Code Online (Sandbox Code Playgroud) 所以这是我的快速排序代码
def quicksort(A):
if len(A) > 1:
pivot = A[0]
L = []
E = []
R = []
for i in A:
if i < pivot:
L.append(i)
elif i == pivot:
E.append(i)
else:
R.append(i)
quicksort(L)
quicksort(R)
A = L + E + R
Run Code Online (Sandbox Code Playgroud)
我运行时的输出
array = [5,6,3,2,7]
print "original array" + str(array)
quicksort(array)
print "sorted array" + str(array)
Run Code Online (Sandbox Code Playgroud)
是
original array[5, 6, 3, 2, 7]
sorted array[5, 6, 3, 2, 7]
Run Code Online (Sandbox Code Playgroud)
但是,当我使用调试器逐步执行该函数时,最后一个值A持有的是[2,3,5,6,7],它被排序,为什么A在函数执行后不能保持这个?
这之间有什么性能差异:
for item in collection:
if item == badItem:
break
else
doFunction(item)
Run Code Online (Sandbox Code Playgroud)
还有这个:
for item in collection:
if item == badItem:
break
doFunction(item)
Run Code Online (Sandbox Code Playgroud)
假设我这样做了几亿次,所以任何性能差异都会有所帮助.
编辑:我实际上并没有根据这个问题的结果实现这个,我只是在理论上想知道什么是更快.我只是好奇.
python ×6
algorithm ×1
c ×1
cpython ×1
django ×1
haskell ×1
html-parsing ×1
javascript ×1
pillow ×1
python-2.7 ×1
python-3.x ×1
random ×1
sorting ×1
web-scraping ×1