将Python(可能通过中间C表示)编译成机器代码是否可行?
据推测,它需要链接到Python运行时库,Python标准库的任何Python部分本身都需要编译(并链接).
此外,如果您想对表达式进行动态评估,则需要捆绑Python解释器,但也许不允许这样做的Python子集仍然有用.
它会提供任何速度和/或内存使用优势吗?据推测,Python解释器的启动时间将被消除(尽管共享库仍需要在启动时加载).
我正在尝试评估对数字列表进行排序的两个Python方法的性能。两者的时间复杂度似乎均为n ^ 2,但经验数据表明,其中一个的性能优于另一个。有什么原因吗?
我写了两种方法,一种使用嵌套的for循环,另一种方法是找到一个最大值并将该max迭代添加到新列表中(并从旧列表中删除)。
方法1:
def mysort1(l):
i = 0
j = 1
for i in range(0,len(l)-1):
for j in range(i,len(l)):
if l[i] > l[j]:
tmp = l[j]
l[j] = l[i]
l[i] = tmp
return l
Run Code Online (Sandbox Code Playgroud)
方法2:
def mysort2(l):
nl = []
for i in range(0,len(l)):
m = max(l)
nl.insert(0, m)
l.remove(m)
return nl
Run Code Online (Sandbox Code Playgroud)
两者均以相反的顺序用10000个数字进行了测试。使用配置文件时,方法1大约需要8秒(10000次以上的调用),方法2仅需要0.6秒(30000次以上的调用)。尽管两种方法的时间复杂度相同,但为什么方法2的性能比方法1更好的任何原因?
为什么以下L2范数计算之间的速度差异如此之大:
a = np.arange(1200.0).reshape((-1,3))
%timeit [np.sqrt((a*a).sum(axis=1))]
100000 loops, best of 3: 12 µs per loop
%timeit [np.sqrt(np.dot(x,x)) for x in a]
1000 loops, best of 3: 814 µs per loop
%timeit [np.linalg.norm(x) for x in a]
100 loops, best of 3: 2 ms per loop
Run Code Online (Sandbox Code Playgroud)
据我所知,这三个结果均相同。
这是numpy.linalg.norm函数的源代码:
x = asarray(x)
# Check the default case first and handle it immediately.
if ord is None and axis is None:
x = x.ravel(order='K')
if isComplexType(x.dtype.type):
sqnorm = dot(x.real, x.real) + dot(x.imag, x.imag) …Run Code Online (Sandbox Code Playgroud) 简单地在python和C++中运行一个近空的for循环(如下所示),速度非常不同,python慢了一百多倍.
a = 0
for i in xrange(large_const):
a += 1
Run Code Online (Sandbox Code Playgroud)
int a = 0;
for (int i = 0; i < large_const; i++)
a += 1;
Run Code Online (Sandbox Code Playgroud)
另外,我该怎么做才能优化python的速度?
(另外:我在这个问题的第一个版本中做了一个不好的例子,我并不是说a = 1因此C/C++编译器可以优化它,我的意思是循环本身消耗了大量资源(也许我应该使用+ = 1作为示例.. ..我的意思是如何优化是如果for循环就像一个+ = 1那么简单,它怎么能以与C/C++类似的速度运行?在我的练习,我使用了Numpy所以我不能再使用pypy了(现在),是否有一些通用的方法可以更快地制作循环(例如生成列表中的生成器)?)
def main():
i = 2
sum = 1
while i < 100000:
j = 2
while j < i:
if i%j == 0:
sum += 1
break
j += 1
i += 1
print(sum)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
#include<iostream>
using namespace std;
int main() {
int sum = 1;
for (int i=2; i<100000; i++) {
for (int j=2; j<i; j++) {
if (i%j == 0) {
sum++;
break;
}
}
}
cout << sum << endl;
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我正在做项目euler Q14.
哪个起始编号低于一百万,产生最长的collatz链?
看到有人能在0.7秒内获得成绩,我感到非常惊讶.当我看到它只是一个天真的蛮力解决方案时更加惊讶.
我怀疑是因为我花了很多时间来优化我的python版本,将运行时间降低到大约一分钟.所以我自己运行代码...... OP没有说谎.
我将相同的代码翻译成Python,5分钟后无法终止.
是什么赋予了?
C版:http://codepad.org/VD9QJDkt
#include <stdio.h>
#include <time.h>
int main(int argc, char **argv)
{
int longest = 0;
int terms = 0;
int i;
unsigned long j;
clock_t begin, end;
double time_spent;
begin = clock();
for (i = 1; i <= 1000000; i++)
{
j = i;
int this_terms = 1;
while (j != 1)
{
this_terms++;
if (this_terms > terms)
{
terms = this_terms;
longest = i;
}
if (j % …Run Code Online (Sandbox Code Playgroud)