优化配分函数

2024-01-30

这是Python中的代码:

# function for pentagonal numbers
def pent (n):     return int((0.5*n)*((3*n)-1))

# function for generalized pentagonal numbers
def gen_pent (n): return pent(int(((-1)**(n+1))*(round((n+1)/2))))

# array for storing partitions - first ten already stored
partitions = [1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42]

# function to generate partitions 
def partition (k):
 if (k < len(partitions)): return partitions[k]

 total, sign, i = 0, 1, 1

 while (k - gen_pent(i)) >= 0:
  sign   = (-1)**(int((i-1)/2))
  total += sign*(partition(k - gen_pent(i)))
  i     +=  1

 partitions.insert(k,total)
 return total

它使用此方法来计算分区:

p(k) = p(k − 1) + p(k − 2) − p(k  − 5) − p(k − 7) + p(k − 12) + p(k  − 15) ...

(来源:维基百科 http://en.wikipedia.org/wiki/Partition_%28number_theory%29#Generating_function)

然而,当涉及大数(超过 p(10^3)​​)时,代码会花费相当长的时间。我想问您是否可以优化我的代码,或者提示我一种不同但更快的算法或方法。欢迎任何优化建议。

不,在你问之前,这不是为了家庭作业或欧拉计划,而是为了经验值。


以下是一些评论。请注意,我不是这方面的专家,因为我也喜欢搞数学(和欧拉计划)。

我重新定义了五边形数函数如下:

def pent_new(n):
    return (n*(3*n - 1))/2

def gen_pent_new(n):
    if n%2:
        i = (n + 1)/2
    else:
        i = -n/2
    return pent_new(i)

我以不引入浮点计算的方式编写它们 - 对于大 n 使用浮点数会引入错误(比较结果n = 100000001).

您可以使用timeit http://docs.python.org/library/timeit.html#module-timeit模块来测试小代码片段。当我测试所有五边形函数(你的和我的)时,我的结果更快。下面是一个测试你的例子gen_pent功能。

# Add this code to your script
t = Timer("for i in xrange(1, 100): gen_pent(i)", "from __main__ import gen_pent")
print t.timeit()

这是对您的稍作修改partition功能。再次,用 timeit 进行测试表明它比你的要快partition功能。然而,这可能是由于对五边形数函数的改进所致。

def partition_new(n):
    try:
        return partitions_new[n]
    except IndexError:
        total, sign, i = 0, 1, 1
        k = gen_pent_new(i)
        while n - k >= 0:
            total += sign*partition_new(n - k)

            i += 1
            if i%2: sign *= -1
            k = gen_pent_new(i)

        partitions_new.insert(n, total)
        return total

在您的配分函数中,您为每个循环计算两次一般五边形数。一次在while条件下测试,另一次更新total。我将结果存储在变量中,因此每个循环只计算一次。

使用cProfile http://docs.python.org/library/profile.html#module-profilemodule(对于 python >= 2.5,否则为 profile 模块),您可以看到代码大部分时间都花在哪里。这是一个基于您的配分函数的示例。

import cProfile
import pstats

cProfile.run('partition(70)', 'partition.test')
p = pstats.Stats('partition.test')
p.sort_stats('name')
p.print_stats()

这会在控制台窗口中产生以下输出:

C:\Documents and Settings\ags97128\Desktop>test.py
Fri Jul 02 12:42:15 2010    partition.test

         4652 function calls (4101 primitive calls) in 0.015 CPU seconds

   Ordered by: function name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      552    0.001    0.000    0.001    0.000 {len}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
       60    0.000    0.000    0.000    0.000 {method 'insert' of 'list' objects}
        1    0.000    0.000    0.015    0.015 <string>:1(<module>)
     1162    0.002    0.000    0.002    0.000 {round}
     1162    0.006    0.000    0.009    0.000 C:\Documents and Settings\ags97128\Desktop\test.py:11(gen_pent)
    552/1    0.005    0.000    0.015    0.015 C:\Documents and Settings\ags97128\Desktop\test.py:26(partition)
     1162    0.002    0.000    0.002    0.000 C:\Documents and Settings\ags97128\Desktop\test.py:5(pent)

现在分析我的配分函数:

Fri Jul 02 12:50:10 2010    partition.test

         1836 function calls (1285 primitive calls) in 0.006 CPU seconds

   Ordered by: function name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
       60    0.000    0.000    0.000    0.000 {method 'insert' of 'list' objects}
        1    0.000    0.000    0.006    0.006 <string>:1(<module>)
      611    0.002    0.000    0.003    0.000 C:\Documents and Settings\ags97128\Desktop\test.py:14(gen_pent_new)
    552/1    0.003    0.000    0.006    0.006 C:\Documents and Settings\ags97128\Desktop\test.py:40(partition_new)
      611    0.001    0.000    0.001    0.000 C:\Documents and Settings\ags97128\Desktop\test.py:8(pent_new)

您可以在我的结果中看到没有调用len and round内置函数。我已经将五边形函数的调用次数几乎减少了一半(gen_pent_new and pent_new)

可能还有其他技巧可以提高 python 代码的速度。我会在这里搜索“python optimization”,看看你能找到什么。

最后,您提到的维基百科页面底部的链接之一是学术论文 http://www.site.uottawa.ca/~ivan/F49-int-part.pdf计算分区数的快速算法。快速浏览一下就会发现它包含算法的伪代码。这些算法可能比你我能产生的任何算法都要快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化配分函数 的相关文章

  • 如何使用 pyinstaller 包含文件?

    我也使用 tkinter 使用 python 3 7 编写了一个程序 由于我使用的是外部图片 因此当我将所有内容编译为一个 exe 时 我需要包含它们 我试过做 add data bg png files 但我仍然收到此错误 tkinter
  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • 使用 Django Rest 保存 Base64ImageField 类型会将其保存为原始图像。如何将其转换为普通图像

    我的模型中有 5 个图像字段 imageS imageS imageS imageS 和 imageE 我正在尝试按以下方式保存图像 图像的类型Base64ImageField images imageA imageB imageC ima
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 处理大文件的最快方法?

    我有多个 3 GB 制表符分隔文件 每个文件中有 2000 万行 所有行都必须独立处理 任何两行之间没有关系 我的问题是 什么会更快 逐行阅读 with open as infile for line in infile 将文件分块读入内存
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • C++:编译错误 - “不会创建 .eh_frame_hdr 表”

    我应该使用数据分析程序进行物理实验 但我无法编译它 该代码很旧 与我能找到的当前 GCC 版本并不真正兼容 为了让事情变得更耗时 我从一个人那里得到了代码 他修改了所有 makefile 以使其在 Mac 上编译 我没有 C 经验 但凭借手
  • C++ 命令行字符串像 Java 一样吗?

    有没有办法像 Java 一样从命令行获取 C 字符串 public static void main String args 其中 args 是 C 字符串数组 不完全是 但你可以很容易地接近 include
  • 如何保证正确捕获并重新触发表单提交事件?

    这可能不是您常见的 如何捕获表单提交事件 问题 我试图理解恰恰jQuery vanilla Javascript 和浏览器 IE FF Chrome Safari Opera 如何处理表单提交事件 以及它们之间的关系 请参阅我的另一个问题
  • unix中nice和setpriority的区别

    我正在尝试用 C 语言实现 unix 的 nice 命令的不同风格 我已经看到了 Nice 系统调用和 setpriority 调用的定义 Nice 调用仅增加 减少进程的优先级 如果我想将进程的优先级设置为特定值 我不能使用nice 调用
  • connect/expressjs 中的“签名”cookie 是什么?

    我试图弄清楚 签名cookie 到底是什么 网上没有太多 如果我尝试这个 app use express cookieParser A secret 但仍然 Cookies在浏览器上仍然是100 正常的 而且我真的不知道这里的 签名 是什么
  • 如何使用 ZF3 设置延迟加载(任何地方都没有 ServiceLocator 模式)

    我正在编写一个新的 ZF2 应用程序 我注意到 从任何地方 调用服务的 ServiceLocator 使用模式已从 ZF3 中弃用 我想为ZF3编写代码 我能够设置我的控制器在构造函数时调用所有依赖项 但这意味着加载 即Doctrine在我
  • body-parser - 扩展选项(qs 与查询字符串)

    在当前版本中正文解析器 https github com expressjs body parser the extended使用时的选项bodyParser urlencoded 现在需要 在自述文件中 它解释了 扩展选项允许选择使用 q
  • filter_var 和验证整数值

    我正在尝试验证我的变量是否是 32 位有符号整数 我以为我可以用filter var and FILTER VALIDATE INT但显然 PHP 对 int 的定义完全不同 999999999999999999通过没有问题 看着PHP d
  • 内联汇编标签已定义错误[重复]

    这个问题在这里已经有答案了 我正在尝试编写我的第一个内联 asm 程序 它是一个素数函数 我收到这些错误 prime c 30 Error symbol loop top is already defined prime c 38 Erro
  • 从 GraphQL 响应中清除不需要的字段

    我有一个 GraphQL 客户端请求的对象 这是一个相当简单的对象 type Element content ElementContent elementId String name String notes String type Str
  • 导入 db phpMyAdmin - 错误格式参数不正确

    我正在尝试将生产 mysql 数据库导入本地 xampp 测试环境 通过连接到Web管理 mozff 并简单导出sql 不需要其他任何东西 然后转到本地phpmyadmin仪表板并导入 它抛出以下错误 Error 居住环境 数据库服务器 S
  • JScrollPane 滚动到最后添加的行

    我有 JTextArea 文本和 JScrollPane pane new JScrollPane text 我放置pane setAutoScrolls true 当我将一些文本附加到窗格在末尾 最后一行 滚动的组件文本时 如何获得该结果
  • 在 C# 中将 int[] 转换为 byte[]

    我知道如何长期执行此操作 通过创建所需大小的字节数组并使用 for 循环来转换 int 数组中的每个元素 我想知道是否有更快的方法 因为如果上面的方法似乎会崩溃int比一个大sbyte 如果你想要按位复制 即从一个 int 中获取 4 个字
  • 更新嵌套对象时 UseState 不重新渲染

    我通过将数据推送到旧状态对象并将其作为值返回来更新 useEffect 这段代码实际上改变了 useState 中的 series 变量 但没有重新渲染 为什么 import TimeSeries Pipeline Stream Event
  • 如何将windows上的代码文件与WSL/linux同步?

    基本上我有一些 C C 代码需要在 Linux 机器上构建和调试 不幸的是 我的 Windows 笔记本电脑没有足够的可用硬盘空间来安装某些 Linux 发行版 也没有足够的可用 RAM 来舒适地运行 VM 到目前为止 我使用 WSL 处理
  • 存储来自 Google JavaScript API 请求的响应

    在使用 Google 尝试 Google 的 Javascript API 时 我遇到了一个障碍 var response var request gapi client request path plus v1 people THEUSE
  • 如何将图像从客户端发送到服务器节点 js 反应

    我正在尝试创建上传个人资料图像方法 帮助用户在网站上上传他们的个人资料图片 但我遇到了问题 我不知道如何将图像从客户端发送到服务器并使这些图像存储在 cloudinary 或 firebase 上 我的路线如下所示 ProfileAPI j
  • 在 Cocoa Objective-C 中创建模态对话框或窗口?

    我需要创建一个模式对话框 该对话框从 nib 文件加载 并应在主窗口中单击按钮时显示 我可以在 nib 文件中创建自定义窗口 并在单击按钮时加载自定义对话框 但这不是模式对话框 我可以切换回主窗口 MyWindowController is
  • “.tt”扩展名是什么?

    我和一群人一起工作something js tt使用 Knockout 和一堆的 JavaScript 文件something else ttHTML 文件 基础设施主要是带有 Perl 服务 API 的 C 后端 我们使用这些 tt文件来
  • 优化配分函数

    这是Python中的代码 function for pentagonal numbers def pent n return int 0 5 n 3 n 1 function for generalized pentagonal numbe