Меньше и быстрее, чем функция Нолена:
def partitions(n, I=1):
yield (n,)
for i in range(I, n//2 + 1):
for p in partitions(n-i, i):
yield (i,) + p
Давайте сравним их:
In [10]: %timeit -n 10 r0 = nolen(20)
1.37 s ± 28.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [11]: %timeit -n 10 r1 = list(partitions(20))
979 µs ± 82.9 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [13]: sorted(map(sorted, r0)) == sorted(map(sorted, r1))
Out[14]: True
Похоже, что это в 1370 раз быстрее n = 20
.
Во всяком случае, это все еще далеко от accel_asc
:
def accel_asc(n):
a = [0 for i in range(n + 1)]
k = 1
y = n - 1
while k != 0:
x = a[k - 1] + 1
k -= 1
while 2 * x <= y:
a[k] = x
y -= x
k += 1
l = k + 1
while x <= y:
a[k] = x
a[l] = y
yield a[:k + 2]
x += 1
y -= 1
a[k] = x + y
y = x + y - 1
yield a[:k + 1]
Это не только медленнее, но требует гораздо больше памяти (но, очевидно, гораздо легче запомнить):
In [18]: %timeit -n 5 r2 = list(accel_asc(50))
114 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)
In [19]: %timeit -n 5 r3 = list(partitions(50))
527 ms ± 8.86 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)
In [24]: sorted(map(sorted, r2)) == sorted(map(sorted, r3))
Out[24]: True
В ActiveState можно найти другие версии: Генератор целочисленных разделов (рецепт Python) .
Я использую Python 3.6.1 и IPython 6.0.0.
Спасибо. Вот полный пример, который теперь работает:
$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';
$client = new SoapClient(null, array(
'location' => $URL,
'uri' => "http://www.Nanonull.com/TimeService/",
'trace' => 1,
));
$return = $client->__soapCall("getTimeZoneTime",
array(new SoapParam('ZULU', 'ns1:timezone')),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Вы можете попробовать добавить еще один вызов array ()
вокруг своих параметров, например:
$params = array('timezone'=>'ZULU' );
$return = $client->__soapCall("getTimeZoneTime",
array($params),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Я не могу это проверить, но вы можете.
Проблема заключается где-то в отсутствии информации о пространстве имен в параметре. Я использовал первый случай вашего примера, поскольку он был наиболее близок к тому, что я придумал.
Если вы измените строку:
array(new SoapParam('ZULU', 'timezone')),
на:
array(new SoapParam('ZULU', 'ns1:timezone')),
, она должна дать вам ожидаемый результат.