Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(docs/lang/python.md): 新增Python性能优化、递归限制的说明 #5578

Open
wants to merge 7 commits into
base: master
Choose a base branch
from

Conversation

XYCode-Kerman
Copy link

@XYCode-Kerman XYCode-Kerman commented May 3, 2024

  • 我已认真阅读贡献指南 (contributing guidelines) 和社区公约 (code of conduct),并遵循了如何参与页及格式手册页的相应规范。

Copy link

welcome bot commented May 3, 2024

感谢你对 OI Wiki 的关注!记得检查是否遵守了格式规范,听说和项目风格统一的 Pull Request 会更容易被 Merge~

@XYCode-Kerman XYCode-Kerman marked this pull request as draft May 3, 2024 16:37
@r-value
Copy link
Contributor

r-value commented May 3, 2024

这一部分内容和 OI 的关系可能有点过小了? 首先 OI 根本不能用 Python 答题, 其次如果是打表的话, 如果是性能敏感的打表那么从一开始就写 C++ 大概率能跑出更多数据. 再次如果是作为脚本跑对拍的话, 作为一个胶水语言并不需要关心它的实际性能.

以及 OI Wiki 不是编程语言文档

@XYCode-Kerman
Copy link
Author

这一部分内容和 OI 的关系可能有点过小了? 首先 OI 根本不能用 Python 答题, 其次如果是打表的话, 如果是性能敏感的打表那么从一开始就写 C++ 大概率能跑出更多数据. 再次如果是作为脚本跑对拍的话, 作为一个胶水语言并不需要关心它的实际性能.

以及 OI Wiki 不是编程语言文档

CCF GESP等认证、比赛是可以采用Python答题的,本PR主要是为了服务于GESP等比赛的Python组选手。

image

您提到的OI Wiki 不是编程语言的文档和学习指南中提到了”出于知识收录需要,OI Wiki 可以收录编程竞赛常用语言的简单使用指南。“,个人认为对于Python的性能调优应当也属于”简单使用指南“的范畴。

@r-value
Copy link
Contributor

r-value commented May 3, 2024

CCF GESP等认证、比赛是可以采用Python答题的,本PR主要是为了服务于GESP等比赛的Python组选手。

这些比赛和算法竞赛是否相关可能有待商榷(

@XYCode-Kerman
Copy link
Author

五级以上才涉及(雾

image

@XYCode-Kerman
Copy link
Author

实在不行可以性能优化部分删了吧,反正我感觉写的也有点冗长了🤔

但是递归限制这方面个人觉得可以加上去(分治、DFS、BFS等算法用得到)

@r-value
Copy link
Contributor

r-value commented May 3, 2024

但是递归限制这方面个人觉得可以加上去(分治、DFS、BFS等算法用得到)

这方面的话, 感觉需要谨慎一些写? 因为 Python 的栈帧挺大的, 默认限制递归层数还是比较有道理的? 随便解禁不一定合适也不一定能达到预期目的

@XYCode-Kerman
Copy link
Author

但是递归限制这方面个人觉得可以加上去(分治、DFS、BFS等算法用得到)

这方面的话, 感觉需要谨慎一些写? 因为 Python 的栈帧挺大的, 默认限制递归层数还是比较有道理的? 随便解禁不一定合适也不一定能达到预期目的

3000感觉某些情况还是不不够,而且这个限制是CPython解释器里定义的,和CPP的操作系统定义不同。而且也不符合正式比赛中“程序实际可用栈空间与题目内存限制相同”的描述

开大栈中也提到了Windows上解除CPP栈限制的方法

@r-value
Copy link
Contributor

r-value commented May 3, 2024

这个限制是CPython解释器里定义的,和CPP的操作系统定义不同。

我完全理解这个问题, 但我的疑问和 C++ 是无关的. 我的意思是您是否完全理解这样做所产生的所有影响以及是否完全理解这样做能否达到预期目的(

比如在 Python 的栈帧远大于 C++ 的情形下直接增大递归限制会对性能以及资源消耗产生什么影响(

@XYCode-Kerman
Copy link
Author

这个限制是CPython解释器里定义的,和CPP的操作系统定义不同。

我完全理解这个问题, 但我的疑问和 C++ 是无关的. 我的意思是您是否完全理解这样做所产生的所有影响以及是否完全理解这样做能否达到预期目的(

比如在 Python 的栈帧远大于 C++ 的情形下直接增大递归限制会对性能以及资源消耗产生什么影响(

可以确认起码不会导致RE等情况,因为Python的调用栈本质是一个由Frame组成的链表,跟操作系统的调用栈无关。

而且评测都是在NOI Linux上跑的,CPython解释器的可用栈空间本来就等于题目内存限制

至于对资源占用的影响,我明天去洛谷上用Python写几个DFS、分治的题看看吧

@XYCode-Kerman XYCode-Kerman marked this pull request as ready for review May 4, 2024 06:11
@XYCode-Kerman
Copy link
Author

我在洛谷P1164上测试了一下,没有发现对系统的性能影响(朴素的DFS解法,没有用记忆化搜索)

以下是评测记录:

未解递归限制 解除递归限制

1. Python在不同平台的递归限制不同
2. 推荐递归限制的设定不要超过10^4
@XYCode-Kerman
Copy link
Author

Python在不同平台的递归限制好像不同(pystate.h#L202),我改了一下

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants