想象一下,你在一座有猫的高楼里.这只猫可以在低矮的故事窗口中摔下来,但如果从高楼层抛出,它就会死亡.你怎么能用最少的尝试数来计算猫可以存活的最长时间?
显然,如果你只有一只猫,那么你只能线性搜索.先从一楼扔猫.如果它存活下来,从第二个扔掉它.最终,从地板f抛出后,猫会死.然后你知道楼层f-1是最大的安全楼层.
但是,如果你有一只以上的猫怎么办?您现在可以尝试某种对数搜索.让我们说这个版本有100层,你有两个相同的猫.如果你将第一只猫从50楼扔出去并且死亡,那么你只需要线性搜索50个楼层.如果您为第一次尝试选择较低楼层,则可以做得更好.假设您选择一次解决20个楼层的问题,并且第一个致命楼层是#50.在这种情况下,你的第一只猫将在从60楼死亡之前从20楼和40楼的飞行中幸存下来.你只需要分别检查楼层41到49.这总共有12次尝试,这比你试图使用二进制消除所需的50次要好得多.
一般来说,对于有2只猫的n层建筑来说,最好的策略和最坏情况的复杂性是什么?n楼和m猫怎么样?
假设所有猫都是等同的:它们都将从给定窗口的摔倒中幸存或死亡.此外,每一次尝试都是独立的:如果一只猫在跌倒时幸存下来,它就完全没有受到伤害.
这不是家庭作业,虽然我可能已经解决了一次学校作业.这只是一个异想天开的问题,今天突然出现在我脑海中,我不记得解决方案了.如果有人知道此问题的名称或解决方案算法的加分点.
language-agnostic algorithm dynamic-programming asymptotic-complexity
这个关于perl中无限循环的问题很感兴趣:while(1)vs.for(;;)有速度差吗?,我决定在python中运行类似的比较.我期望编译器会为while(True): pass和生成相同的字节代码while(1): pass,但实际上并非python2.7中的情况.
以下脚本:
import dis
def while_one():
while 1:
pass
def while_true():
while True:
pass
print("while 1")
print("----------------------------")
dis.dis(while_one)
print("while True")
print("----------------------------")
dis.dis(while_true)
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 12 (to 15)
>> 3 LOAD_GLOBAL 0 (True)
6 JUMP_IF_FALSE 4 (to 13)
9 POP_TOP
9 10 JUMP_ABSOLUTE 3
>> 13 POP_TOP …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的装饰器,在调用装饰函数之前记录给定的语句.记录的语句应该看起来都来自同一个函数,我认为这是functools.wraps()的目的.
为什么以下代码:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)20s - %(message)s')
from functools import wraps
def log_and_call(statement):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
logging.info(statement)
return func(*args, **kwargs)
return wrapper
return decorator
@log_and_call("This should be logged by 'decorated_function'")
def decorated_function():
logging.info('I ran')
decorated_function()
Run Code Online (Sandbox Code Playgroud)
导致日志语句如:
wrapper - This should be logged by 'decorated_function'
decorated_function - I ran
Run Code Online (Sandbox Code Playgroud)
我认为对换行的调用会用wrapped_function的名称重命名包装器.
我正在使用python 2.7.1.
我正在使用Vagrant和chef-solo来测试我的食谱,但我有一个特殊的食谱需要厨师服务器(它使用搜索).我希望我的默认配方如下所示:
include_recipe 'some_recipe'
include_recipe 'some_other_recipe'
unless running_as_chef_solo?
include_recipe 'a_recipe_that_requires_chef_server'
end
Run Code Online (Sandbox Code Playgroud)
如何检查厨师是否在菜谱中作为厨师独奏运行,所以我可以跳过不支持的食谱?
我正在尝试将一个字段添加到Django模型中,该模型将代表电子邮件地址列表.我希望用户在管理员的表单中输入逗号分隔的地址列表,然后我的应用程序将解析以发送一系列电子邮件.
我目前的实现涵盖了基本概念,但有很大的局限性.在管理员中,如果我输入一个类似的字符串foo@example.com, bar@example.com,那么它会正确地将其写入数据库中[u'foo@example.com', u'bar@example.com'].但管理员显示此序列化值而不是人性化字符串.更重要的是,如果我编辑并保存记录而不进行任何更改,则相同的转换将更[u'foo@example.com', u'bar@example.com']改为[u"[u'foo@example.com'", u"u'bar@example.com']"].
如何将python列表表示转换回用于管理员的字符串?这是value_to_string方法的目的还是我需要在其他地方进行转换?
我目前的自定义模型字段如下:
class EmailListField(models.TextField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not value:
return
if isinstance(value, list):
return value
return [address.strip() for address in value.split(',')]
def get_db_prep_value(self, value):
if not value:
return
return ','.join(unicode(s) for s in value)
def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value)
Run Code Online (Sandbox Code Playgroud)
这是基于SeparatedValuesField这里描述的:http://www.davidcramer.net/code/181/custom-fields-in-django.html.
我正在编写一个简单的链表实现,如下所示:
class Node(object):
def __init__(self, value):
self.value = value
self._next = None
def __iter__(self):
here = self
while here:
yield here
here = here._next
def __len__(self):
print("Calling __len__ on: {}".format(self))
return sum(1 for _ in self)
def append_to_tail(self, value):
if self._next is None:
self._next = Node(value)
else:
self._next.append_to_tail(value)
def print_list(ll):
print(ll.value)
if ll._next:
print_list(ll._next)
my_list = Node('a')
my_list.append_to_tail('b')
my_list.append_to_tail('c')
print_list(my_list)
Run Code Online (Sandbox Code Playgroud)
没有__len__方法,此代码运行正常.删除这三行并运行上面的代码输出:
first
second
third
Run Code Online (Sandbox Code Playgroud)
但是,如果__len__存在该方法,则结果为:
first
Calling __len__ on: <__main__.Node object at 0x108804dd0>
Calling __len__ on: …Run Code Online (Sandbox Code Playgroud) 我正在使用mod_wsgi在Apache上运行Django应用程序.升级期间会有停机时间吗?
Mod_wsgi以守护进程模式运行,因此我可以通过触摸.wsgi脚本文件重新加载我的代码,如"ReloadingSourceCode"文档中所述:http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode.据推测,重新加载需要一些非零时间.如果在重新加载期间有请求,会发生什么?Apache会将请求排队,然后在wsgi守护程序准备就绪后完成它吗?
该文档包括以下声明:
因此,如果您在守护程序模式下使用Django并且需要更改"settings.py"文件,则在完成所需更改后,还要触摸包含WSGI应用程序入口点的脚本文件.完成后,在下一个请求中,将重新启动进程并重新加载Django应用程序.
对我来说,这表明Apache将优雅地处理每个请求,但我想我会要求确定.我的应用程序并不重要(一点停机时间不会是灾难性的)所以问题主要是学术问题.
谢谢.
python ×5
django ×2
algorithm ×1
apache ×1
chef-infra ×1
chef-recipe ×1
logging ×1
mod-wsgi ×1
vagrant ×1