هنا هو اقتراح آخر تماما - كنت أحاول أن تجعل في الواقع أفضل، بدلا من أكثر قابلية للقراءة. المشكلة مع التعليمات البرمجية الحالية هي أنه يلخص العديد من الأرقام مرارا وتكرارا، عندما لا حاجة حقا. مقارنة كلا النهجين بعد رمز التنفيذ. إم فقط جمع حفنة لأول مرة، ومن ثم طرح الذيل وإضافة الرأس، مرارا وتكرارا: وهنا هي اختبارات السرعة، مقارنة نهج إعادة الحساب الكامل مقابل هذا واحد: منذ Foo1 هو O (نانومتر) و Foo2 هو O (نانومتر) حقا ليس من المستغرب أن الفرق ضخمة. النتائج على هذا ليس حقا مجنون نطاق واسع هي: النتائج متساوية: صحيح Foo1: 5.52 ثانية Foo2: 61.1 ميلي ثانية وعلى نطاق أوسع (استبدال 1000 مع 10000 على كل من التكرار والعد): Foo1: توقف بعد 10 دقيقة. Foo2: 6.9 ثواني منذ فترة كتبت عن حساب المتوسط المتحرك للبيانات الحية باستخدام طريقة المخزن المؤقت () في الإضافات التفاعلية. طريقة إنشاء المخزن المؤقت من التحديثات التي حدود لك، كما يحدد المطور، ويوفر لك هذا المخزن المؤقت تشغيل مع كل تحديث لاحق. التحديث 8216current8217 سيكون آخر في المخزن المؤقت، والذي يسمح لك لحساب المتوسط المتحرك الشامل، واحد حيث يتم تضمين آخر عامل في النتائج. في الآونة الأخيرة، كان علي أن أفعل شيئا مشابها مع بيانات ثابتة في التطبيق الذي لم يكن يستخدم ر، كان برعم مزود البيانات جيدا يستند إلى لينق. لمفاجأة، وجدت أن لينق لا يوفر طريقة التخزين المؤقت من خارج منطقة الجزاء. لمفاجأتي الكبيرة، وجدت أنه من السهل تنفيذ واحد. الرمز أدناه. لم أكن أريد أن افترض أننا سوف نؤدي فقط متوسط التجميع، لذلك، ظللت حل بلدي عام إلى حد ما. وسيكون الأمر متروك لمستخدم وظيفتي لترميز منطق التجميع. في هذا المنصب، أود أن أظهر متوسط التجميع، ولكن المستخدم من هذه الوظيفة سيكون قادرا على القيام بأي شيء مع مجموعة معينة من العناصر. أولا، Let8217s تحديد بنية بيانات تسمى تجميع والتي سيتم استخدامها للف الأصلي وإضافة خاصية أغريغاتدفالو (السطر 16) أننا سوف يتم ملؤها أثناء عملية التجميع. ثم أنا أعرف عينة تيمداتابوانت التي سيتم استخدامها للاحتفاظ بالأسعار الأسهم في بلدي المثال. وأخيرا، تعرف let8217s الدالة لينق التي من شأنها أن تخفف مجموعة من العناصر في المجموعة الأصلية وستعيد مجموعة معدلة مع عدد أقل من العناصر، حيث يحتوي كل عنصر على قيمة تجميع لمجموعة المخزنة مؤقتا. للمطالبة بالنجاح، أنا بحاجة إلى اختبار وظيفة. للعب مع الأرقام الحقيقية، let8217s الحصول على تاريخ عائدات الأسهم مسفت الأسبوعية من ياهو. Let8217s تصدير هذه البيانات إلى التفوق وخلق مجموعة من المتوسطات المتحركة من سعر إغلاق لاختبار بياناتنا. Here8217s ما يجب أن يبدو عليه جدول البيانات: يمكننا بعد ذلك إنشاء مجموعة بيانات نموذجية لتمثيل أسعار الإغلاق الأصلية. يمكننا بعد ذلك اختبار وظيفتنا إنشاء حساب متوسط متحرك على مجموعة البيانات. الرمز أدناه. أولا، أنا إنشاء البيانات، ثم أنا إيتيريت من خلال مجموعة البيانات، الأنابيب البيانات في وظيفة مجمع بلدي، والذي بدوره يدعو لي مرة أخرى ويطلب مني اتخاذ 2 قرارات هامة: 1. يجب أن يستمر التخزين المؤقت (خطوط 60 و 71) 2 (خط 61 في المثال الأول والخطوط 74-82 في الثانية) يجب أن يتطابق ناتج العينة مع عمود متوسط 6 أيام في جدول البيانات المرفق. لقد وجدت هذه الدالة مجمع مفيدة جدا. آمل أن تفعل ذلك أيضا. من أجل تحقيق أداء أليمبوتيكال من O (n) (كما يفعل الحل مرمزة يدويا)، هل يمكن استخدام الدالة التجميعية مثل في القيمة المتراكمة (التي تنفذ كنوع مجهول) يحتوي على حقلين: يحتوي على النتيجة قائمة النتائج تتراكم حتى الآن. يحتوي العمل على آخر عناصر الفترة -1. تقوم الدالة التجميعية بإضافة القيمة الحالية إلى قائمة العمل، وتبني المتوسط الحالي وتضيفها إلى النتيجة، ثم تقوم بإزالة القيمة الأولى (أي الأقدم) من قائمة العمل. يتم بناء البذور (أي قيمة البداية للتراكم) من خلال وضع الفترة الأولى من العناصر 1 في العمل وتهيئة النتيجة إلى قائمة فارغة. وبالتالي يبدأ التجميع ثا مع فترة العنصر (عن طريق تخطي (الفترة -1) العناصر في البداية) في البرمجة الوظيفية هذا هو نمط استخدام نموذجي للدالة أغريتات (أو أضعاف)، راجع للشغل. الحل ليس وظيفيا نظيفة في أن نفس الكائنات القائمة (العمل والنتيجة) يتم استخدامها في كل خطوة. إم غير متأكد إذا كان هذا قد يسبب مشاكل إذا حاول بعض المجمعين في المستقبل لموازنة الدالة التجميع تلقائيا (من ناحية أخرى أنا أيضا غير متأكد، إذا كان ذلك ممكنا بعد كل شيء). الحل الوظيفي البحت يجب إنشاء قوائم جديدة في كل خطوة. لاحظ أيضا أن C تفتقر إلى تعبيرات قائمة قوية. في بعض افتراضية بيثون - C - مختلطة بسيودوكود يمكن للمرء أن يكتب وظيفة التجميع مثل الذي سيكون قليلا أكثر أناقة في رأيي المتواضع :) لاحظ وقت تشغيل O (N2). منذ تحتاج إلى تخطي المزيد والمزيد من العناصر في كل خطوة (و أفيك تخطي (ط) لديه لاستدعاء IEnumerator. MoveNext ط مرات). انظر ردي لحل في O (n) الوقت. (لقد لاحظت فقط تعليق أوبس أدناه أن هيش ربما الحصول على القيم من دب سكل في المستقبل. في هذه الحالة أود أن كل تثبيط بقوة من هذا الحل) نداش مارتنستيتنر مار 3 11 في 0:53 لأكبر طريقة ممكنة لحساب متوسط متحرك مع لينق، يجب أن لا تستخدم لينق بدلا من ذلك أقترح إنشاء فئة المساعد الذي يحسب المتوسط المتحرك بأكثر الطرق كفاءة ممكنة (باستخدام العازلة دائرية والسببية مرشح المتوسط المتحرك)، ثم وسيلة التمديد لجعله في متناول إلى لينق. أولا، المتوسط المتحرك توفر هذه الفئة تنفيذ سريع جدا وخفيف الوزن لفلتر موفينغافيراج. أنه يخلق عازلة دائرية من طول N ويحسب إضافة واحدة وطرح واحد واحد ضرب لكل نقطة بيانات إلحاق، بدلا من N مضاعفة يضيف لكل نقطة لتنفيذ القوة الغاشمة. طرق التمديد أعلاه التفاف فئة موفينغافيراج والسماح الإدراج في تيار إينوميرابل. للقيام بذلك بطريقة أكثر وظيفية، تحتاج إلى طريقة المسح الضوئي الموجود في ر ولكن ليس في لينق. دعونا ننظر كيف سيبدو كما لو كان هناك طريقة المسح الضوئي و هيريس طريقة المسح الضوئي، اتخذت و تعديلها من هنا: هذا ينبغي أن يكون أداء أفضل من طريقة القوة الغاشمة لأننا نستخدم مجموع تشغيل لحساب سما. للبدء نحتاج لحساب الفترة الأولى التي نسميها البذور هنا. ثم، كل قيمة لاحقة نحسب من قيمة البذور المتراكمة. للقيام بذلك نحن بحاجة إلى القيمة القديمة (وهذا هو t - دلتا) وأحدث قيمة التي نحن الرمز البريدي معا سلسلة، مرة واحدة من البداية وتحولت مرة واحدة من قبل دلتا. في النهاية نفعل بعض تنظيف عن طريق إضافة الأصفار لطول الفترة الأولى وإضافة القيمة الأولية البذور. أجاب 19 يونيو 13 في 22:58
No comments:
Post a Comment