Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Однако если производительность имеет значение, то стоит взять Си
язык, позволяющий эффективнее заниматься оптимизацией
имя, сестра, имя!
а арифметика указателей — это как раз применение знания особенностей архитектуры машины для написания более эффективного кода.
Я не вижу особой разницы между решением задачи в терминах языка А и решением ее же в терминах языка Б
И да, я считаю, что задача, адаптированная к машине, будет в итоге скомпилирована в более эффективный код
До сих пор мне не встречалось ни одной задачи, не решаемой на чистом C.
А интерпретируемые языки, безусловно, медленнее, поэтому мне было немного непонятно, почему вы привели в пример питон.
def func1(a1, a2): ... some calculations return something1 def func2(b1, b2, b3, b4, b5, b6=v1, b7=v2): ... some calculations return something2
@memoize def func1(a1, a2): ... some calculations return something1 @memoize def func2(b1, b2, b3, b4, b5, b6=v1, b7=v2): ... some calculations return something2
Безусловно, сам мемоизатор получится достаточно сложным, но я думаю, что реализация этого атрибута @memoize в питоне ничуть не проще :)
from decorator import decorator def getattr_(obj, name, default_thunk): "Similar to .setdefault in dictionaries." try: return getattr(obj, name) except AttributeError: default = default_thunk() setattr(obj, name, default) return default @decorator def memoize(func, *args): dic = getattr_(func, "memoize_dic", dict) if args in dic: return dic[args] else: result = func(*args) dic[args] = result return result
и кастинги != баги.
(=) ≠ (⇒)
☺template<typename R, typename ... Args> std::function<R(Args ...)> memoize(R f(Args ...)) { auto l_f = [=](Args ... args) -> R { typedef std::tuple<Args ...> args_pack_t; typedef std::tuple<args_pack_t, R> memoize_val_t; static std::vector<memoize_val_t> values; args_pack_t args_pack(args ...); for (auto p = values.begin(); p != values.end(); ++ p) { if (std::get<0>(*p) == args_pack) return std::get<1>(*p); } R ret_val = f(args ...); values.push_back(memoize_val_t(args_pack, ret_val)); return ret_val; }; return l_f; }
int f(int a, double b) { return (a + 10) * b; } int main() { auto f_ = memoize(f); std::cout << f_(10, 20) << std::endl; std::cout << f_(10, 20) << std::endl; std::cout << f_(10, 40) << std::endl; return 0; }
Если задача действительно сложна, и производительность реально имеет значение, то стоит выкинуть C/C++. И взять язык, позволяющий эффективнее заниматься оптимизацией. А не слежением за памятью или арифметикой указателей.
Любой ЯВУ.
Где занимаешься задачей в терминах задачи, а не «байтов»/«указателей»/«шаблонов».
Математики, Маткады, Матлабы
Однако если производительность имеет значение, то стоит взять Си, и иметь ввиду архитектуру машины «много лишнего», как вы выразились.
Мне совсем непонятно, почему «производительность» и «безопасность» для языка — взаимоисключающие понятия.
О неявных объявлениях, обратной совместимости и ABI