本周末我正在研究一个项目,我需要使用二项分布来测试事件的概率(y字符的x将是随机字节的字母数字的概率)。我的第一个解决方案是自己编写测试,因为它很简单。
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
def binomial_prob(n,k,p):
bin_coeff = (factorial(n))/(factorial(k)*factorial(n-k))
return = bin_coeff * pow(p,k) * pow((1 - p),(n-k))
我用过它。但是,SciPy包含了一个binom_test方法。但是,对于分发,这可能会显着增加尺寸(需要SciPy和NumPy),这是一个相对简单的测试。我想一个辅助问题是py2exe的智能程度。它只是导入我使用的模块,从SciPy和NumPy,或整个库。我只期待我参考的模块,但我想下一个问题是SciPy.stats所依赖的模块数量。但是我离题了...所以我的问题是,我应该何时使用已经编写的代码,其代价远远超出我的需要,何时应该编写自己的实现?
(我将其标记为python,但我认为这可能是一个更普遍的问题)
答案 0 :(得分:5)
“我应该何时使用已经编写的代码,但代价远远超出我的需要”
始终
我应该何时编写自己的实现?
从不。
“包括远远超过我需要的”问题通常很愚蠢。你关心“包括”多少?
唯一重要的是,当你编写嵌入式软件并严重受内存限制时。
对于所有其他编程 - 所有其他编程 - 不要三思而后行。尽早并经常包含预先编写的代码。少写。更快地解决问题。操作系统将未使用的页面交换内存。你可以放心地忽略它们。
编程是关于解决问题,而不是生成代码。更少的代码更好。没有代码是最好的。
答案 1 :(得分:0)
答案取决于谁将使用您的应用程序以及它的分发范围。 Unix / Linux人员倾向于大力使用现有的库,因为它们被用于每台机器,它们是一台可以从源代码重建自己的软件的开发机器。部分原因是必要的,因为本机代码库通常需要编译并链接到本地环境。但是在Windows上它完全是一个不同的命题,因为大多数用户不能,不会,也不应该这样做,所以你必须考虑这些第三方库的使用将如何影响你的分发计划 - 就许可证,在下载大小,可用性等方面。
你在谈论py2exe,它告诉我你正在制作一个单文件可执行文件,以便分发给Windows用户。这意味着您的主要关注点将是兼容性(因为包含本机代码的库只能在一种类型的平台上运行 - 尽管Win32代码应该没问题)和大小,因为py2exe不会对依赖项做任何狡猾的事情;期望将整个事物捆绑到您的可执行文件中。最好的方法是打包它,看看会发生什么。这是一个简单而非破坏性的步骤,所以你应该尽快为自己尝试。
您还需要考虑您分发的任何图书馆的许可。 “再利用一切”人群有时会忘记这一点,因为他们经常使用他们不需要重新分配的软件,所以这不是问题。对于您而言,它可能是,特别是如果您拥有由您的雇主或机构拥有的代码,尽管重要的是要意识到当您分发Python应用程序时,您实际上是为任何人分发源代码以供查看。