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