假设我有一个模型:
class SomeModel(models.Model):
id = models.AutoField(primary_key=True)
a = models.CharField(max_length=10)
b = models.CharField(max_length=7)
Run Code Online (Sandbox Code Playgroud)
目前我使用默认管理员来创建/编辑此类型的对象.如何b从管理员中删除该字段,以便无法使用值创建每个对象,而是将接收默认值0000000?
Big-O表示法[1]在实践中失败的一些例子是什么?
也就是说:算法的Big-O运行时间何时会预测算法A比算法B快,但实际上算法B运行时会更快?
稍微宽泛一点:何时对算法性能不匹配的理论预测观察到运行时间?非Big-O预测可以基于搜索树中的平均/预期旋转次数,或者排序算法中的比较次数,表示为因子乘以元素的数量.
澄清:
不管有些答案的说法,大O符号是指预测算法的性能.也就是说,这是一个有缺陷的工具:它只谈论渐近性能,并且模糊了常数因素.这样做有一个原因:它意味着预测算法性能,而不依赖于您执行算法的计算机.
我想知道的是:这个工具的缺陷什么时候显示出来?我发现Big-O符号非常有用,但远非完美.有什么陷阱,边缘情况,陷阱?
我正在寻找的一个例子:使用Fibonacci堆而不是二进制堆运行Dijkstra的最短路径算法,得到O(m + n log n)时间对O((m + n)log n),对于n顶点和m边.你期望迟早会从斐波纳契堆中速度增加,但是在我的实验中说速度增加从未实现过.
(实验证据,没有证明,表明在均匀随机边缘权重上运行的二进制堆花费O(1)时间而不是O(log n)时间;这是实验的一个重要问题.另一个需要计算的婊子是预期的调用DecreaseKey的次数).
[1]真的不是失败的符号,而是符号所代表的概念,以及预测算法性能的理论方法.</抗炫学>
在接受的答案上:
我已经接受了一个答案来强调我希望的那种答案.许多不同的答案同样存在:)我喜欢的答案是,它建议了Big-O表示法"失败"时的一般规则(当缓存未命中占据执行时间时),这也可能增加理解(在某种意义上)我不知道如何最好地表达ATM).
你如何找到有趣的问题来解决?
我经常想学习新的编程语言.但是,我觉得要真正理解它,我必须写一些东西:
真实 - 它应该解决一些现实世界的问题.这个问题不一定是新的(事实上,有一个参考解决方案可能是一个好主意),但它必须是迫使我找出一些肮脏,肮脏的细节的东西.我不想解决数学难题或实现算法和数据结构,因为这只会教我如何解决数学(或A&DS)问题'new-language.
我可以充满激情的东西 - 学习新编程语言的细节需要时间.这意味着我必须投入那段时间.为了帮助我保持动力,我想在某种程度上解决对我有吸引力的问题.我认为这部分是最困难的,至少对我而言,从我所有的半成品项目来看; 它也是最重要的部分.无论一个问题是多么现实,如果你没有解决问题,你就不会从中学习.
与热情的方面相关联,我想要的东西我有信心,只有在我的业余时间工作时,我才能带到可运输的状态.即使"C编译器"是非常真实的世界,我真的很喜欢编译器,但它有点大.即使是简单的表达式评估器,当您不熟悉特定语言的习语时,也可以多次重新设计,调试和优化.
那么,你(或者你)如何解决找到有趣工作的问题?
特别的解决方案 - 也就是工作上的问题 - 将受到高度赞赏,但是(原谅傲慢)他们只是"愚蠢的知识".我印象最深刻的是思考和攻击问题的新方法(即算法>>数据:D).
编辑:到目前为止,获胜者是"制作游戏"和"修复令你烦恼的东西(编程|使用comptuers)".
游戏建议认为有很多相当简单的游戏我可以重新实现(给我一大堆选择的问题进行攻击),它们绝对是现实世界,而且我是游戏玩家所以我对好的充满热情游戏.
"修复烦人的东西"具有内置的激情和现实世界,但它要求我不会因为事情正常工作而被破坏,并且修复不会修改一些不是用我想要的语言编写的程序学习.
(你们都赢得了一个赞成.接受可能正在接受)
该mapAndSum代码块下面的所有方式结合功能map和sum(不去管另一个sum是在主函数中应用,它只是用来使输出紧凑型).它map是懒惰地计算的,而sum使用累积参数计算.这个想法是,结果map可以在没有完整列表的情况下被消费,并且(仅)之后sum可以"免费"获得.main函数表示调用时我们遇到了无法反驳的模式问题mapAndSum.让我解释一下这个问题.
根据Haskell标准,无可辩驳的模式示例let (xs, s) = mapAndSum ... in print xs >> print s被翻译成
(\ v -> print (case v of { (xs, s) -> xs })
>> print (case v of { (xs, s) -> s }))
$ mapAndSum ...
Run Code Online (Sandbox Code Playgroud)
因此,两个print调用都带有对整个对的引用,这导致整个列表保存在内存中.
我们(我的同事Toni Dietze和我)使用明确的case陈述解决了这个问题(比较"坏"与"好2").顺便说一句,发现这一点花了我们相当多的时间..!
现在,我们不理解的是双重的:
为什么mapAndSum首先工作?它还使用无可辩驳的模式,因此它也应该将整个列表保留在内存中,但显然不会.并且转换let为a case将使该函数表现为完全不受欢迎(到堆栈溢出的程度;没有双关语意图).
我们看了GHC生成的"核心"代码,但就我们所能解释的那样,它实际上包含了与let上面相同的翻译.所以在这里没有任何线索,而是更多的混乱.
为什么"不好?" 关闭优化时工作,但打开优化时不工作? …
我想学习C#(在Linux上,所以使用Mono),我正在寻找一些能够掌握其他语言知识的指南; 最着名的是C,C++和Java(还有python,Haskell,lisp,也许还有其他一些).
到目前为止,我在网上找到的所有内容都是将编程介绍和C#介绍结合起来,但它们都失败了,因为我感到无聊,无法坚持我的学习计划.
有没有人建议好好阅读?
扩大这个问题,你如何学习一种类似于你已经知道的语言的新语言,以一种掌握你已有知识的方式?人们会写这些教程吗?你刚抓到一张备忘单吗?你有一系列练习吗?
编辑:我不知道任何其他Microsoft开发......好事.八年前我写了一点VB,但我不记得了.我没有ASP经验,没有任何其他.NET,没有MS语言或库的经验.即使我是在Windows上开发的,我还没有完成资本-D Windows开发.在提出建议时请考虑这一点.
对我来说,翻译模式听起来非常像一个被称为格林普森第十条规则的反模式:
任何足够复杂的C或Fortran程序都包含一个特殊的,非正式指定的,错误缠身的,一半Common Lisp的缓慢实现.
也就是说,如果你需要使用Interpreter,你可能会创建一些缓慢,临时和指定不当的东西.正确的解决方案是从一开始就使用正确的语言.
或者,或者,在您的应用程序中嵌入一个众所周知且语言清晰的语言,例如Guile(GNU可嵌入方案).或者使用Haskell作为嵌入式域特定语言.
但我在实践中没有看到这一点 - 您在构建自己的嵌入式语言方面有哪些经验?这是个好主意吗?它比嵌入已有的语言更好吗?
(我不是特别喜欢lisp的粉丝.这很好,但是C和Haskell以及python和很多其他语言都是如此.)
lisp design-patterns anti-patterns greenspunning interpreter-pattern
我有一个程序,它遍历一个表达式树,该树对概率分布进行代数,采样或计算结果分布。
\n我有两种计算分布的实现:一种 ( computeDistribution) 可以很好地与 monad 转换器重用,另一种 ( simpleDistribution) 我用手将所有内容具体化。我不想手动具体化所有内容,因为这将是采样和计算代码之间的代码重复。
我还有两种数据表示形式:
\ntype Measure a = [(a, Rational)]\n-- data Distribution a = Distribution (Measure a) deriving Show\nnewtype Distribution a = Distribution (Measure a) deriving Show\nRun Code Online (Sandbox Code Playgroud)\n当我使用data带有可重用代码的版本时,计算 20d2 ( ) 的分布ghc -O3 program.hs; time ./program 20 > /dev/null大约需要一秒钟,这似乎太长了。选择更高的值n需要您自担风险。
当我使用手工具体化代码,或者使用newtype任一实现的表示时,计算 20d2 ( time ./program 20 s > /dev/null) 只需眨眼的时间。
为什么?
\n我怎样才能找出原因?
\n我对 …
performance haskell algebraic-data-types data-representation newtype
作为我的程序之一,我想捕获任何程序MemoryError并将其记录下来。目前,我正在使用traceback.format_exception所有其他异常的格式。我也想这样做MemoryError。
但是,使用format_exception需要使用更多的内存,这正是我内存不足时无法执行的操作。
做什么?
当我抛出MemoryError终止消息时该怎么办?理想情况下,我会记录它们,然后基于释放处理程序和thrower *之间的堆栈部分为我释放足够的内存这一假设来恢复程序。
(*以及仅由该堆栈部分发出的引用保持活动的那些堆对象)
haskell ×2
python ×2
accumulator ×1
algorithm ×1
big-o ×1
c# ×1
discovery ×1
django ×1
django-admin ×1
ghc ×1
lisp ×1
logging ×1
memory ×1
newtype ×1
performance ×1
space-leak ×1
theory ×1