Python3.3:Square
这里是Python3.3上的代码:
import sys, re, math
str1 = str(sys.stdin.readlines())
Data = re.findall('bd+b', str1)
for i in reversed (Data):
print('%.4f' % math.sqrt(float(i)))
正如你所看到的,这个程序从输入中抓取数据(多行随机字符串),并搜索这个字符串包含的每个数字。 之后,它只返回找到的每个数字的平方根。
那么,算法的作品,但速度不够快,我不知道如何优化它。 请帮助我。 我需要做什么来优化上面的代码?
这是一个消极的结果。 我尝试使用一些技巧来使其更快,但速度只有一点点。
import sys, re, math
def find_numbers(f):
for line in f:
for word in line.split():
if word.isdigit():
yield float(word)
lst = list(find_numbers(sys.stdin))
lst.reverse()
for x in lst:
print('%.4f' % math.sqrt(x))
我认为反转列表可能会让它变慢,但是当我只是在没有反转的情况下打印数字时,它并没有太大的区别。
Python的最快解决方案就是在PyPy中运行上面的代码。
这不是一个很难的问题,如果你需要速度,你可能想用C代码编写一个解决方案。 C代码将尽可能快地解决这个问题。
您可以尝试使用Numpy加载和处理文件:
import numpy as np
for i in reversed(np.fromfile(sys.stdin, sep=' ')**0.5):
print i
作为Python的高性能数字库,我期望它成为您可用的最快解决方案。
你问了Python,但是这可以在C中很好地完成。这个C程序不会反转数字,但是你可以简单地通过tac
程序输出输出,这就cat
但是会颠倒线条。
在我的测试中,这大约是NumPy解决方案速度的3倍,大约是我的Python解决方案或原始解决方案速度的6倍。
#include <ctype.h>
#include <math.h>
#include <stdio.h>
int
main()
{
char buf[1024];
char ch;
float f;
int i, n;
for (i = 0;;)
{
ch = getchar();
if (i > sizeof(buf))
{
fprintf(stderr, "number too long!n");
return 1;
}
if (isspace(ch) || EOF == ch)
{
if (i > 0)
{
buf[i] = ' ';
n = atoi(buf);
f = sqrtf(n);
printf("%0.4fn", f);
i = 0;
}
if (EOF == ch)
return 0;
continue;
}
buf[i++] = ch;
}
}
链接地址: http://www.djcxy.com/p/85731.html
上一篇: Python3.3: Square
下一篇: how to propery specify a gradient function for use in optim() or other optimizer